密码学大数四则运算源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdafx.h"
#include
#include
using namespace std;
#define max 100
char data[36]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g',
'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
//36进制对照表
struct stack
{
int top;
char d[max];
}st1,st2;
struct sta
{
int top;
int d[max];
};
int J=0;//表示进位
int J1=1;//表示正负号,减法中用到
stack s3;
void plus(stack s1,stack s2)//加法算法
{
int i,m,j=0;
int m1,m2;
s3.top=-1;//用于存放和
for(i=s1.top;i>=0;i--)
{
m1=0;
while(m1<36)
{
if(s1.d[s1.top]!=data[m1])
m1++;
else
break;
}
m2=0;
while(m2<36)
{
if(s2.d[s2.top]!=data[m2])
m2++;
else
break;
}
m=m1+m2+J;
s3.top++;
s3.d[s3.top]=data[m%36];
J=m/36;
s1.top--;
s2.top--;
}
for(i=s2.top-s1.top-1;i>=0;i--)
{
m2=0;
while(m2<36)
{
if(s2.d[i]!=data[m2])
m2++;
else
break;
}
s3.top++;
s3.d[s3.top]=data[m2%36+J];
J=m2/36;
}
if(J==1)
{
s3.top++;
s3.d[s3.top]='1';
}
cout<<"加法计算结果:"<
cout<
int cmp(stack s1,stack s2)//比较两数大小,相等返回0,s1>s2返回1,s1
if(s1.top>s2.top)
return 1;
else
if(s1.top
else
{
int i=0;
while(i<=s1.top)
{
int m1,m2;
m1=0;
while(m1<36)
{
if(s1.d[i]!=data[m1])
m1++;
else
break;
}
m2=0;
while(m2<36)
{
if(s2.d[i]!=data[m2])
m2++;
else
break;
}
if(m1>m2)
return 1;
else
if(m1
else
i++;
}
if(i==s1.top+1)
return 0;
}
}
void minus(stack s1,stack s2)//减法算法
{
int m,m1,m2;
s3.top=-1;
if(cmp(s1,s2)==0)
{
s3.top=-1;
}
else
if(cmp(s1,s2)==1)
{
int i=s2.top;
while(i>=0)
{
m1=0;
while(m1<36)
{
if(s1.d[s1.top]!=data[m1])
m1++;
else
break;
}
m2=0;
while(m2<36)
{
if(s2.d[s2.top]!=data[m2])
m2++;
else
break;
}
m=m1-m2-J;
if(m<0)
{
m+=36;
J=1;
}
else
J=0;
s3.top++;
s3.d[s3.top]=data[m];
s1.top--;
s2.top--;
i--;
}
for(i=s1.top-s2.top-1;i>=0;i--)
{
m1=0;
while(m1<36)
{
if(s1.d[s1.top]!=data[m1])
m1++;
else
break;
}
m=m1-J;
if(m<0)
{
m+=36;
J=1;
}
else
J=0;
s3.top++;
s3.d[s3.top]=data[m];
s1.top--;
}
while(s3.d[s3.top]=='0')
s3.top--;
//********为后继除法准备********
m=0;
for(i=s3.top;i>=0;i--)
{
s1.d[m]=s3.d[i];
m++;
}
m--;
s1.top=m;
m=0;
for(i=0;i<=s1.top;i++)
{
s3.d[m]=s1.d[i];
m++;
}
m--;
s3.top=m;
//******************************
}
else
{
J1=-1;
minus(s2,s1);
}
}
void multiply(stack s1,stack s2)//乘法算法
{
int i,j;
int m,m1,m2;
sta s4;
s4.top=s1.top+s2.top+1;
for(i=0;i<=s4.top;i++)
{
s4.d[i]=0;
}
for(j=s2.top;j>=0;j--)
{
m2=0;
while(m2<36)
{
if(s2.d[s2.top]!=data[m2])
m2++;
else
break;
}
for(i=s1.top;i>=0;i--)
{
m1=0;
while(m1<36)
{
if(s1.d[s1.top]!=data[m1])
m1++;
else
break;
}
m=m1*m2+J;
s4.d[i+j+1]+=m%36;
J=m/36;
}
}
if(J!=0)
{
s4.d[0]=J;
cout<<"乘法结果为:"<
cout<cout<
else
{
for(i=1;i<=s4.top;i++)
cout<cout<
}
void divide(stack s1,stack s2)//除法算法,主要以调用减法来完成
{
int count=0;
int curs1=0;
stack s4;//s4存商,s3存余数
s4.top=-1;
int i;
for(i=0;i<=s2.top;i++)
{
s3.d[i]=s1.d[i];
}
s3.top=s2.top;
curs1=s3.top;
if(cmp(s3,s2)==-1)
{
s3.top++;
s3.d[s3.top]=s1.d[s3.top];
curs1=s3.top;
}
while(curs1<=s1.top)
{
count=0;
while(cmp(s3,s2)!=-1)
{
minus(s3,s2);
count++;
}
s4.top++;
s4.d[s4.top]=data[count];
curs1++;
if(curs1>s1.top)
goto loop;
s3.top++;
s3.d[s3.top]=s1.d[curs1];
while(cmp(s3,s2)==-1)
{
s3.top++;
s3.d[s3.top]=s1.d[s3.top];
curs1++;
}
loop:;
}
cout<<"商为:"<
{
cout<
cout<
{
cout<<'0';
}
else
for(i=0;i<=s3.top;i++)
{
cout<
cout<
void main()
{
st1.top=-1;
st2.top=-1;
cout<<"请输入第一个数字(36进制):"<
int i;
while(s!='\n')
{
cin.get(s);
st1.top++;
st1.d[st1.top]=s;
}
st1.top--;
s='!';
cout<<"请输入第二个数字(36进制):"<
{
cin.get(s);
st2.top++;
st2.d[st2.top]=s;
}
st2.top--;
cout<<"请选择要做的运算:"<
switch(s)
{
case '+':
if(st1.top<=st2.top)
plus(st1,st2);
else
plus(st2,st1);
break;
case '-':
minus(st1,st2);
if(s3.top==-1)
cout<<"相减结果为:0"<
if(J1==1)
{
cout<<"相减结果为:"<
else
cout<<"相减结果为:"<
cout<
case '*':
multiply(st1,st2);break;
case '/':
divide(st1,st2);break;
default:
cout<<"error"<
}
}