大整数相乘

来源:互联网 发布:广联达计量软件 编辑:程序博客网 时间:2024/05/16 12:49
/*功能:完成来个大整数的相乘*//*解题思路:读入俩个大整数,将他们分别放在俩个字符串中,申明第三个字符串用来保存结果。其中涉及到字符和数字转化的技巧,具体实现请看代码。*/#include <iostream>#include <string>#include <stdlib.h>using namespace std;int main(){string str1,str2,tem;int len1,len2,len3,i,j,m,n;cout<<endl<<"      *******************该程序完成俩个大整数的相乘***********************"<<endl;cout<<"输入第一个大整数:\n";cin>>str1;cout<<"输入第二个大整数:\n";cin>>str2;//分别求出俩个大整数的长度len1=str1.size();len2=str2.size();//将位数高的字符串放到str1中,将位数低的字符串放到str2中if(len1<len2){tem=str1;str1=str2;str2=tem;i=len1;len1=len2;len2=i;}//k中保存来至低位的进位,开始的时候应该为0int k=0;//str3中保存相乘后的结果,将str3声明为最大数字位数的二倍加2足够,其中最后一位用来作为标志位,保存的是'\0',以便读取的时候不会越界len3=2*len1+2;char *str3 = new char[len3];//将str3中的内容清零memset(str3,'0',len3);str3[len3-1]=0;//外层循环表示乘数,内层循环表示被乘数,用乘数的各位与被乘数相乘结果保存到str3中for(i=len2-1;i>-1;i--){//从str3最后一个数字位的前一位存放数字,最后一个数字位已经放上了0len3=len3-1;m=len3-1;//拿出被乘数的每一位与该乘数位相乘for(j=len1-1;j>-1;j--,m--){n=(str2[i]-'0')*(str1[j]-'0')+(str3[m]-'0')+k;if(n<10){str3[m]=n+'0';k=0;}else{str3[m]=n%10+'0';k=n/10;}}//在最后一次要将来自低位的进位加到str3中while(k>10){str3[m]=k%10+'0';k=k/10;m--;}str3[m]=k+'0';k=0;}//以下功能是为打印服务的,若前几位是字符0,则不打印i=0;while(str3[i]=='0'){i++;}str3+=i;cout<<"运算结果为:"<<str3<<endl;return 0;}