/*功能:完成来个大整数的相乘*/
/*
解题思路:
读入俩个大整数,将他们分别放在俩个字符串中,申明第三个字符串用来保存结果。
其中涉及到字符和数字转化的技巧,具体实现请看代码。
*/
#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--)
{
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;
}
大整数相乘
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.