C++大數相乘

2014-04-06 11:32 pm
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
char number1[40];
char number2[40];
char a[80];

cout << "請輸入第一個整數(不超過40位數):";
cin >> number1;
cout << "請輸入第二個整數(不超過40位數):";
cin >> number2;

int size1 = strlen(number1);
int size2 = strlen(number2);
int size3 = strlen(number1) + strlen(number2);

for( int count = 0 ; count < size2 ; count++ )
{
for( int i = 0 ; i < size1 ; i++ )
{
a[count+i] += number1[i] * number2[count];
}
}
for( int i = 0 ; i < size3 ; i++ )
if( a[i] > 9 )
{
a[i+1] = a[i+1] + a[i] / 10;
a[i] = a[i] % 10;
}

for( int i = 0 ; i < size1 ; i++ )
cout << number1[i];

cout << " * ";
for( int i = 0 ; i < size2 ; i++ )
cout << number2[i];

cout << " = ";
for( int i = 0 ; i < size3 ; i++ )
cout << a[i];

system("pause");
return 0;
}

這是我寫的CODE 可是會算出亂碼,是否把char轉成int就OK了?
想請大家幫我解答 謝囉
以下是題目:
設計一個程式,可以做大數「整數」相乘。整數包含正整數、零、負整數。
輸入範例:
請輸入第一個整數(不超過40位數): 987654321123456789
請輸入第二個整數(不超過40位數): 21
結果:987654321123456789 * 21 = 20740740743592592569

回答 (2)

2014-04-07 3:03 am
✔ 最佳答案
邏輯上我不替你細看了。單看算式
a[count+i] += number1[i] * number2[count];
就知你沒有了char跟數字的概念。
number是一個char array,即係string。輸入的都是ascii碼。
看一看ascii表

圖片參考:https://s.yimg.com/lo/api/res/1.2/KegGsWjIwSV_1JY6uDR5mg--/YXBwaWQ9dHdhbnN3ZXJzO3E9ODU-/http://www.asciitable.com/index/asciifull.gif

所以number1[i]若是字母0,當成byte計算會是0x30,(十進是48)。
要正式的計算數字,可以type case為integer,然後減去48。
即係 digit_multiply = ((int) number1[i] -48 ) * ((int) (number2[count] -48) ;
數字最大會是99,所以答案必須化成十位及個位,(用integer division 及 modulus % )然後加到答案中的a[x] 及 a[x+1],不過,因為你的邏輯是用char array,相加前又要把a的字母減去48,加完又加48變回ascii,而且又會引發進位問題,所以,基於simply is beautiful,建議你把number1及number2先做一次減48,即係全部轉成byte數值,你可以直接用你本身的算式,進位處理要化成十位及個位再加到a。最後打印答案時,每一個byte加48就可以變成ascii。
good luck
2014-04-07 3:27 am
既然是大數相乘,應該考慮負數的處理 ^^


收錄日期: 2021-04-13 21:17:54
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20140406000051KK00087

檢視 Wayback Machine 備份