求兩個大整數的相乘問題
日常常見的就是兩個大整數相乘了。前面日志中曾經做過大數階乘問題。其實問題都類似。隻是前面當時用的是重複相加而得結果,然而,如果階乘很大的話,重複相加也不能解決問題的,必須用數組來進行存儲,然後模拟國小時豎式相乘的思想,即在一個數組中每個元素都隻能是0~9,如果超越了這個界限,則進位到高位。在處理這個問題中,為了更好的思維,我們将其倒序,最後倒序輸出。
【問題】階乘計算
<a href="http://blog.163.com/zhoumhan_0351/blog/static/3995422720102165536445/">http://blog.163.com/zhoumhan_0351/blog/static/3995422720102165536445/</a>
#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 have input is:"<<endl;
cout<<str1<<endl<<str2<<endl;
Calcuate(str1,str2);
}//while