您的位置:首页 > 其它

[源码]个人的大数相乘法及[转载]大数加减乘除法完全设计

2007-06-09 17:31 393 查看
/**********************************************
*以下是:.用户输入两个不大于256位的正整数,进行乘法运算并显示运算结果

*作者:jianxiong8814
*日期:2007年6月9日
*************************************************/

#define M 512

//#include <iostream.h>
#include <stdio.h>
//#include <memory.h>
#include <windows.h>

typedef struct tagNUM1
{
BYTE add[M];
int n;
}num;

num MUL(num num1, num num2)
{
int i, j, k;
BYTE btemp;
num temp;

memset(temp.add, 0, M);

//将输入数据重新由低位到高位排列
for(i=0; i<num1.n/2; i++)
{
btemp = num1.add[i];
num1.add[i] = num1.add[num1.n-1-i];
num1.add[num1.n-1-i] = btemp;

}
for(i=0; i<num2.n/2; i++)
{
btemp = num2.add[i];
num2.add[i] = num2.add[num2.n-1-i];
num2.add[num2.n-1-i] = btemp;

}

//进行乘法运算
for(i=0; i<num1.n; i++)
{
for(j=0; j<num2.n; j++)
{
temp.add[i+j] += num1.add[i]*num2.add[j];
temp.add[i+j+1] += temp.add[i+j]/10;
temp.add[i+j] = temp.add[i+j]%10;
}
}
for(k=num1.n+num2.n-1; k>=0; k--)
{
if(temp.add[k] == 0)
continue;
break;
}
temp.n = k+1;

for(i=0; i<temp.n/2; i++)
{
btemp = temp.add[i];
temp.add[i] =temp.add[temp.n-1-i];
temp.add[temp.n-1-i] = btemp;

}
return temp;
}

void main()
{
int i, j, m, n;
char gchar;

num a, b, result;

i = j = m = n = 0;
memset(a.add, 0, M);
memset(b.add, 0, M);
memset(result.add, 0, M);

printf("输入,每个数以回车作为输入完毕辩识/n");
while((gchar=getchar()) != '/n')
{
a.add[i] = gchar - 48;
i++;
}
a.n = i;

while((gchar=getchar()) != '/n')
{
b.add[j] = gchar - 48;
j++;
}
b.n = j;

result = MUL(a, b);

for(m=0; m<result.n; m++)
{
printf("%d", result.add[m]);

}
printf("/n");

}

/**********转载*********************

*用户输入两个不大于256位的正整数,进行乘法运算并显示运算过程与结果
*例:输入12,32
*输出:
*12
*× 32
*-----
*24
*36
*-----
*384
***********************************/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int A[256],B[256];
int Alen,Blen;
int M[256*2];

void InputAB();
void Print(int *Array, int len);
void Mul(int *Array, int len, int n, int *Result, int zeros);
void Add(int *total, int tlen, const int *add, int alen);

void main(int argc, char **argv){
int i;
int tmp[256*2];
InputAB();
Print(A,Alen);
putchar('*');
Print(B,Blen);

puts("-----");

for(i = Blen-1; i >= 0; i--){
Mul(A, Alen, B[i], tmp, Blen - 1 -i);
Print(tmp, Alen + 1);
Add(M, 256*2, tmp, Alen + Blen - i);
}

puts("-----");

Print(M, 256*2);
exit(0);
}
void InputAB(){
int c;

while (!isdigit(c = getchar()));
A[0] = c - '0';
Alen=1;
while (isdigit(c = getchar()))
A[Alen++] = c - '0';

while (!isdigit(c = getchar()));
B[0] = c - '0';
Blen = 1;
while (isdigit(c = getchar()))
B[Blen++] = c - '0';
}
void Print(int *Array, int len){
int i=0;
while ((i<len) && (Array[i] == 0) ) i++;
if (i == len){
putchar('0');
putchar('/n');
return;
}
for ( ;i < len; i++)
putchar(Array[i]+'0');
putchar('/n');
}
void Mul(int *Array, int len, int n, int *Result, int zeros){
int i;
for (i = len - 1; i >= 0; i--)
Result[i+1] = Array[i]*n;
Result[0] = 0;
for (i = len; i > 0; i--){
if (Result[i] >= 10){
Result[i-1] +=Result[i] / 10;
Result[i] %= 10;
}
}
for (i = 1; i <= zeros; i++)
Result[len+i] = 0;
}
void Add(int *total, int tlen, const int *add, int alen){
int i,tmp = tlen;
while ((tlen > 0) && (alen > 0)){
tlen--;
alen--;
total[tlen] += add[alen];
}
for (i = tmp - 1; i>=0; i--){
if (total[i] >= 10){
total[i - 1] += total[i] / 10;
total[i] %= 10;
}
}
}

数据结构课程设计(大数加减乘除法)

说明部分

本软件进入介绍界面后按任意进入功能选择界面。按1、2、3、4分别进入不同的功能操作。在功能操作上只能输入0、1、2、3、4、5、6、7、8、9、回车这十一种字符。比如进入加法功能后,就只能输入一个不超过1000位数的正整数作为加数,然后敲回车确定输入,再输入另一个不超过1000位数的正整数作为另一个加数,敲回车后就会显示相加后的结果。
如果不合法的输入就会被自动打断。比如输入小数点,-、+、*、/、字母等非法符号就会自动跳回介绍界面,重新让用户操作。又比如输入正整数的位数达到1000位还不敲回车,继续输入数字,此时系统将把1001位的输入作为下一个数第一位输入,并自动敲回车,作为第一个数达到1000位的结束,一个数最多也只能输入1000位,这就得到保证了。
操作过程中希望遵守法则,如果哪里还有错误,请发邮件到kansome2008@163.com与我联系,或者QQ到609961194,又或者电话到020-38982629,谢谢指导!

#include<iostream>
#include<conio.h>
#include<stdlib.h>
#define max 2002

using namespace std;

typedef struct
{
short add[max+1];//最大运算位数
int n; //记录是几位数
}num;

//串的比较大小
short compare(num a,num b)
{
short t=1;
int i,j;
for(i=0;a.add[i]==0;)i++;
if(i)
{
for(j=i;j<=a.n;j++)a.add[j-i]=a.add[j];
a.n=a.n-i;
}
for(i=0;b.add[i]==0;)i++;
if(i)
{
for(j=i;j<=b.n;j++)b.add[j-i]=b.add[j];
b.n=b.n-i;
}
if(a.n>b.n)t=1;
else if(a.n<b.n)t=2;
else
{
for(i=0;i<=a.n;i++)
{
if((a.add[i]-b.add[i])>0)
{
t=1;break;//第一个数大返回 1
}
else if((a.add[i]-b.add[i])<0)
{
t=2;break;//第二个数大返回 2
}
}
if(i>a.n)t=0; //两个数相等返回 0
}
return t;
}

//加法运算
num add(num addend1,num addend2)
{
int carry=0; //进位
num result; //运算结果
int i,j,k,t; //暂存器
for(i=addend1.n,j=addend2.n,k=0;i>=0||j>=0;i--,j--,k++)
{
if(i>=0&&j>=0)
{
t=addend1.add[i]+addend2.add[j]+carry;
result.add[k]=t%10;
carry=(t-t%10)/10;
}
else if(i>=0)
{
t=addend1.add[i]+carry;
result.add[k]=t%10;
carry=(t-t%10)/10;
}
else
{
t=addend2.add[j]+carry;
result.add[k]=t%10;
carry=(t-t%10)/10;
}
}
if(carry)
{
result.add[k]=carry;
result.n=k;
}
else
{
for(;0==result.add[k-1];)k--;
if(k)result.n=k-1;
else result.n=0;
}
return result;
}

//减法运算
num sub(num subtrahend1,num subtrahend2)
{
int carry=1; //进位,新发明的,减法用加法做
num result; //演算结果
int i,j,k,t; //暂存器
result.add[0]=0;
result.n=0;
short comp=compare(subtrahend1,subtrahend2);
if(1==comp) //用comp记录是不是被减数大于减数,如果是就置为1,否则置为2
{
for(i=subtrahend1.n,j=subtrahend2.n,k=0;i>=0;i--,j--,k++)
{
if(j>=0)
{
t=subtrahend1.add[i]-subtrahend2.add[j]+carry+9;
result.add[k]=t%10;
carry=(t-t%10)/10;
}
else
{
t=subtrahend1.add[i]+carry+9;
result.add[k]=t%10;
carry=(t-t%10)/10;
}
}
for(;0==result.add[k-1];)k--;
result.n=k-1;
}
else if(2==comp)
{
for(i=subtrahend1.n,j=subtrahend2.n,k=0;j>=0;i--,j--,k++)
{
if(i>=0)
{
t=subtrahend2.add[j]-subtrahend1.add[i]+carry+9;
result.add[k]=t%10;
carry=(t-t%10)/10;
}
else
{
t=subtrahend2.add[j]+carry+9;
result.add[k]=t%10;
carry=(t-t%10)/10;
}
}
result.add[k]=0;
for(;0==result.add[k-1];)k--;
result.n=k;
}
else return result;
return result;
}

//乘法运算
num mul(num mul1,num mul2)
{
int carry; //进位
num registe1,registe2,registe3; //寄存器
num result; //结果
result.add[0]=0;
result.n=0;
int i,j,k,t; //暂存器
for(i=mul2.n;i>=0;i--)
{
carry=0;
for(j=mul1.n,k=0;j>=0;j--,k++)
{
t=mul1.add[j]*mul2.add[i]+carry;
registe1.add[k]=t%10;
carry=(t-t%10)/10;
}
if(carry)
{
registe1.add[k]=carry;
for(j=0;j<=k;j++)registe3.add[j]=registe1.add[k-j];
for(;j<=k+mul2.n-i;j++)registe3.add[j]=0;
registe3.n=k+mul2.n-i;
}
else
{
for(j=0;j<k;j++)registe3.add[j]=registe1.add[k-j-1];
for(;j<k+mul2.n-i;j++)registe3.add[j]=0;
registe3.n=k+mul2.n-i-1;
}
for(j=result.n;j>=0;j--)
registe2.add[j]=result.add[result.n-j];
registe2.n=result.n;
result=add(registe2,registe3);
}
return result;
}

//除法运算
num div(num division1,num division2,short remainder[])
{
num result;
remainder[0]=0;//没有余数置为0
result.add[0]=0;
result.n=0;
num registe1,registe2,registe3;
int i,j,k,t,n=-1;
for(i=0;division1.add[i]==0;)i++;
if(i)
{
for(j=i;j<=division1.n;j++)
division1.add[j-i]=division1.add[j];
division1.n=division1.n-i;
}
for(i=0;division2.add[i]==0;)i++;
if(i)
{
for(j=i;j<=division2.n;j++)
division2.add[j-i]=division2.add[j];
division2.n=division2.n-i;
}//把两个数的高位零去除
for(i=0;i<=division2.n;i++)
{
if(division2.add[i])break;
}
if(i>division2.n)//除数为零返回错误值
{
result.add[0]=-1;
return result;
}
for(i=0;i<=division1.n;i++)
{
if(division1.add[i])break;
}
if(i>division1.n)
return result;//被除数为零返回0值
short tt,comp;
comp=compare(division1,division2);
if(0==comp)
{
result.add[0]=1;
return result;//除数等于被除数返回1值
}
else if(2==comp)
{
remainder[0]=division1.n+1;
for(i=0;i<=division1.n;i++)
remainder[i+1]=division1.add[i];
return result;//除数大于被除数返回除数作为余数值
} //remainder[0]记录余数是几位数
else
{
for(i=division2.n;i<=division1.n;i++)
{
if(i==division2.n)
{
for(j=0;j<=i;j++)
registe1.add[j]=division1.add[j];
registe1.n=i;
}
else
{
registe1=registe2;
registe1.n++;
registe1.add[registe1.n]=division1.add[i];
}//registe1做新的被除数,registe1[0]是高位
comp=compare(registe1,division2);
if(0==comp)
{
result.add[++n]=1;
registe2.add[0]=0;
registe2.n=0;
}
else if(1==comp)
{
for(j=1;j<=10;j++)
{
registe3.n=0;
registe3.add[0]=j;
registe3=mul(registe3,division2);
for(k=0;k<=registe3.n/2;k++)
{
tt=registe3.add[k];
registe3.add[k]=registe3.add[registe3.n-k];
registe3.add[registe3.n-k]=tt;
}
comp=compare(registe3,registe1);
if(0==comp)
{
result.add[++n]=j;
registe2.add[0]=0;
registe2.n=0;
break;
}
else if(2==comp)continue;
else
{
result.add[++n]=j-1;
registe3.n=0;
registe3.add[0]=j-1;
registe3=mul(registe3,division2);
for(t=0;t<=registe3.n/2;t++)
{
tt=registe3.add[t];
registe3.add[t]=registe3.add[registe3.n-t];
registe3.add[registe3.n-t]=tt;
}
registe3=sub(registe1,registe3);
for(t=0;t<=registe3.n;t++)
registe2.add[t]=registe3.add[registe3.n-t];
registe2.n=registe3.n;
break;
}
}
}
else
{
result.add[++n]=0;
registe2=registe1;
}
}
for(i=0;i<=n/2;i++)
{
tt=result.add[i];
result.add[i]=result.add[n-i];
result.add[n-i]=tt;
}
for(i=n;result.add[i]==0;i--)n--;
if(n>=0)result.n=n;
else result.n=0;
for(i=0;i<=registe2.n;i++)if(registe2.add[i])break;
if(i<=registe2.n)
{
for(j=i,k=1;j<=registe2.n;j++,k++)
remainder[k]=registe2.add[j];
remainder[0]=k-1;
}
}
return result;
}
void main()
{
system("cls");
cout<<"/t/t#============================================#"<<endl;
cout<<"/t/t# 本软件使用说明 #"<<endl;
cout<<"/t/t#============================================#"<<endl;
cout<<"/t/t| 本软件实现两个巨大正整数的加减乘除四种 |"<<endl;
cout<<"/t/t| 运算,如果输入错误,比如输入带小数点的实数 |"<<endl;
cout<<"/t/t| 等,就会跳转到此页面要求用户自己先看清楚说 |"<<endl;
cout<<"/t/t| 明,再继续操作。如果要求本软件做这三种运算 |"<<endl;
cout<<"/t/t| 之外的操作,也会出现错误,并跳回此页面。 |"<<endl;
cout<<"/t/t| 按任意键进入操作选择,比如你如果选择了 |"<<endl;
cout<<"/t/t| 加法运算,进入界面后输入一个整数敲回车,再 |"<<endl;
cout<<"/t/t| 输入另一个整数敲回车,此时运算结果就会出来 |"<<endl;
cout<<"/t/t| 不遵守操作规则就会跳回此页面,另外注意不能 |"<<endl;
cout<<"/t/t| 输入正负号,即没有负数输入。 请按任意键… |"<<endl;
cout<<"/t/t| 2007年 |"<<endl;
cout<<"/t/t#============================================#"<<endl;
cout<<"/t/t#============================================#"<<endl;
getch();system("cls");
cout<<"/t/t#***********************#"<<endl;
cout<<"/t/t| 请选择一种操作: |"<<endl;
cout<<"/t/t| 1、加法运算 |"<<endl;
cout<<"/t/t| 2、减法运算 |"<<endl;
cout<<"/t/t| 3、乘法运算 |"<<endl;
cout<<"/t/t| 4、除法运算 |"<<endl;
cout<<"/t/t#***********************#"<<endl;
cout<<"/t/t#***********************#"<<endl;
int choice;
while(1)
{
choice=getch();
if(choice>48&&choice<53)break;
else cout<<endl<<"输入错误! 请重新输入:"<<endl;
}
system("cls");
if(49==choice)cout<<endl<<"/t/t欢迎进入加法运算/n"<<endl;
else if(50==choice)cout<<endl<<"/t/t欢迎进入减法运算/n"<<endl;
else if(51==choice)cout<<endl<<"/t/t欢迎进入乘法运算/n"<<endl;
else if(52==choice)cout<<endl<<"/t/t欢迎进入除法运算/n"<<endl;
num a,b,c;
c.add[0]=0;
int i,read=0;
for(i=0;(a.add[i]=getch()-48)!=-35;i++)
{
cout<<a.add[i];
if(a.add[i]<0||a.add[i]>9)
{
read=1;break;
}
if(1000==i)
{
i++;
a.add[i]=-35;
break;
}
}
if(a.add[i]==-35)cout<<endl;
if(read)main();
else
{
a.n=i-1;
for(i=0;(b.add[i]=getch()-48)!=-35;i++)
{
cout<<b.add[i];
if(b.add[i]<0||b.add[i]>9)
{
read=1;break;
}
if(1000==i)
{
i++;
b.add[i]=-35;
break;
}
}
if(b.add[i]==-35)cout<<endl;
if(read)main();
else
{
b.n=i-1;
num result;
if(49==choice)result=add(a,b);
else if(50==choice)result=sub(a,b);
else if(51==choice)result=mul(a,b);
else if(52==choice)result=div(a,b,c.add);
cout<<endl<<"计算结果为:";
for(i=result.n;i>=0;i--)//打印结果
{
if((i==result.n)&&(i>0)&&(0==result.add[i]))
cout<<"-";
else if((result.n==0)&&(-1==result.add[i]))
cout<<"错误警告:除数不能为零!";
else
cout<<result.add[i];
}
if(c.add[0])
{
cout<<"/t余数为:";
for(i=1;i<=c.add[0];i++)
cout<<c.add[i];
}
cout<<endl;
getch();system("cls");
cout<<"/n/n是否继续? (y/n)?"<<endl;
while(1) //继续操作询问
{
choice=getch();
if(choice=='y'||choice=='Y'||choice=='n'||choice=='N')break;
else cout<<endl<<"输入格式不对,请输入 y/n 。"<<endl;
}
if(choice=='y'||choice=='Y')main();
else
{
system("cls");
cout<<"/n/n/t/t/t谢谢使用!/n/n/n";
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: