天天看點

3、求兩個大整數的相乘問題

求兩個大整數的相乘問題

日常常見的就是兩個大整數相乘了。前面日志中曾經做過大數階乘問題。其實問題都類似。隻是前面當時用的是重複相加而得結果,然而,如果階乘很大的話,重複相加也不能解決問題的,必須用數組來進行存儲,然後模拟國小時豎式相乘的思想,即在一個數組中每個元素都隻能是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&lt;m;i++){

if((str[i]&gt;'9')||str[i]&lt;'0')

  return false;

return true;

}

}//Dsure

void reverseIt(string&amp; str){

    int m=str.length();

for(int i=0,j=m-1;i&lt;=j;i++,j--){

char temp;

temp=str[i];

str[i]=str[j];

str[j]=temp;

void StrToInt(string str1,int (&amp;a)[N])

{

for(unsigned int i=0;i&lt;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&lt;n;i++)//乘數

for(int j=0;j&lt;m;j++)//被乘數的位置

   {

   Result[i+j]+=b[i]*a[j];

   if(Result[i+j]&gt;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&gt;=0;i--)

  {

  cout&lt;&lt;Result[i];

  }//for

cout&lt;&lt;endl;

int main()

string str1,str2;

while(1)

cout&lt;&lt;"Please input two integer:"&lt;&lt;endl;

cin&gt;&gt;str1&gt;&gt;str2;

if(!Dsure(str1)) 

   cout&lt;&lt;"you must cin a int!!"&lt;&lt;endl;

   }

if(!Dsure(str2))

cout&lt;&lt;"You have input is:"&lt;&lt;endl;

cout&lt;&lt;str1&lt;&lt;endl&lt;&lt;str2&lt;&lt;endl;

Calcuate(str1,str2);

}//while

3、求兩個大整數的相乘問題