求两个大整数的相乘问题
日常常见的就是两个大整数相乘了。前面日志中曾经做过大数阶乘问题。其实问题都类似。只是前面当时用的是重复相加而得结果,然而,如果阶乘很大的话,重复相加也不能解决问题的,必须用数组来进行存储,然后模拟小学时竖式相乘的思想,即在一个数组中每个元素都只能是0~9,如果超越了这个界限,则进位到高位。在处理这个问题中,为了更好的思维,我们将其倒序,最后倒序输出。
【问题】阶乘计算
http://blog.163.com/zhoumhan_0351/blog/static/3995422720102165536445/
#include "iostream"
#include "string"
#pragma warning(disable:4267)
using namespace std;
const int N=1000;
bool Dsure(string str){
int m=str.length();
for(int i=0;i<m;i++){
if((str[i]>'9')||str[i]<'0')
return false;
return true;
}
}//Dsure
void reverseIt(string& str){
int m=str.length();
for(int i=0,j=m-1;i<=j;i++,j--){
char temp;
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}
void StrToInt(string str1,int (&a)[N])
{
for(unsigned int i=0;i<str1.size();i++)
a[i]=str1[i]-'0';
}
void Calcuate(string str1,string str2){
int m=0,n=0,count=0;
int a[N]={0},b[N]={0},Result[2*N]={0};
m=str1.length();//str1*str2,a*b
n=str2.length();
reverseIt(str1);
reverseIt(str2);
StrToInt(str1,a);
StrToInt(str2,b);
for(int i=0;i<n;i++)//乘数
for(int j=0;j<m;j++)//被乘数的位置
{
Result[i+j]+=b[i]*a[j];
if(Result[i+j]>10){
Result[i+j+1]+=Result[i+j]/10;
Result[i+j]=Result[i+j]%10;
}//if
}//for
if(Result[m+n-1]!=0) count=m+n-1;
else count=m+n-2;
for(int i=count;i>=0;i--)
{
cout<<Result[i];
}//for
cout<<endl;
}
int main()
{
string str1,str2;
while(1)
{
cout<<"Please input two integer:"<<endl;
cin>>str1>>str2;
if(!Dsure(str1))
{
cout<<"you must cin a int!!"<<endl;
}
if(!Dsure(str2))
{
cout<<"you must cin a int!!"<<endl;
}
cout<<"You have input is:"<<endl;
cout<<str1<<endl<<str2<<endl;
Calcuate(str1,str2);
}//while
}