大数相乘
2014-06-14 18:09
288 查看
按照正常的计算规则,先用一个数组保存每两位相乘的结果,这里先不进位!等到两个数的所有的位数都计算完毕的时候,在遍历一遍结果数组,使得低位向高位进位!最后将结果进行翻转!
/*使用数组解决大数相乘的问题*/ #include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #define MAX 1000 using namespace std; char * multyplus(char *s1,char *s2,int l1,int l2) { int k; int i,j; int array[MAX]; char *result = new char[MAX];//在调用函数中,使用new分配的内存,它的生存周期为整个函数,而不是局部的函数! memset(array,-1,sizeof(array)); for(i=0;i<l1;i++) { k=i; for(j=0;j<l2;j++) { if(array[k]==-1) array[k++]=(s1[i]-48)*(s2[j]-48);//需要注意的是,字符和数字的区别 else array[k++]+=(s1[i]-48)*(s2[j]-48); } } //处理进位 for(k=0;;k++) { array[k+1]+=array[k]/10; array[k]=array[k]%10; if(array[k+1]==-1) break; } //进行转换 for(i=k,j=0;i>=0;i--,j++) { result[j]=array[i]+48; } result[j]='\0'; return result; } int main() { char s1[20],s2[20],*res; char temp; cout << "~~~~~请输入两个数,中间以空格隔开~~~~~" <<endl; scanf("%s",s1); scanf("%s",s2); //字符串翻转,使得以0开始的为最低位 int l1=strlen(s1); int l2=strlen(s2); for(int i=0;i<l1/2;i++) { temp=s1[i]; s1[i]=s1[l1-1-i]; s1[l1-1-i]=temp; } for(int i=0;i<l2/2;i++) { temp=s2[i]; s2[i]=s2[l2-1-i]; s2[l2-1-i]=temp; } cout<<s1<<' '<<s2<<endl; if(l1>l2) res=multyplus(s1,s2,l1,l2); else res=multyplus(s2,s1,l2,l1); cout<<"使用大数运算进行运算得到的结果:"; cout<<res<<endl; cout<<endl<<endl; cout<<"用计算机直接运算的结果:"; int num1=atoi(s1); int num2=atoi(s2); cout<<num1*num2<<endl; return 0; }