/*功能:完成来个大整数的相乘*/ /* 解题思路: 读入俩个大整数,将他们分别放在俩个字符串中,申明第三个字符串用来保存结果。 其中涉及到字符和数字转化的技巧,具体实现请看代码。 */ #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中保存来至低位的进位,开始的时候应该为0 int 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最后一个数字位的前一位存放数字,最后一个数字位已经放上了0 len3=len3-1; m=len3-1; //拿出被乘数的每一位与该乘数位相乘 for(j=len1-1;j>-1;j--,m--) { int a1=str2[i]-'0'; int a2=str1[j]-'0'; int a3=str3[m]-'0'; 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; }