大意:用string 類型的兩個大數進行相乘,輸出結果
輸入:樣例一:-11 -11
樣例二:-15116516166564654646456456454655 121231312313214984894961116
輸出:樣例一:121
樣例二:-1832595092476562998391796185384824031048718264583442194980
思路:純粹地模擬手動計算兩個數相乘的過程即:
- 判斷是否帶負號,帶負號則取出數值部分
- 以一個字符串的每一位去乘另一個字符串的每一,並用一個字符串保存結果
- 補齊第二步中得到字符串的低位,補充相應個數個0
- 將第三步中得到所有字符串進行相加
- 輸出負號及第四步中得到的數值結果
#include <iostream>
#include <string>
using namespace std;
string max_i,min_i;
string count_add(string s1,string s2) //進行兩個數相加
{
max_i = s1;min_i = s2;
if(s2.size()>s1.size())
{
max_i = s2; //取長度大的數為max
min_i = s1;
}
for(int i = min_i.size()-1,j = max_i.size()-1; i>=0;i--,j--) //模擬整數加的過程
{
max_i[j] += min_i[i] -'0'; //選擇將結果保存在max變量中
if(max_i[j] > '9') //字符值大於9需要處理
{
if(j > 0)
{
max_i[j - 1] ++;
max_i[j] -= 10;
}
else
{
max_i = "1" + max_i;
max_i[j] -= 10;
}
}
}
return max_i;
}
int main()
{
string s1,s2;
cin>>s1>>s2;
int i,j;
bool nega_s1 = false,nega_s2 = false;
if(s1[0] == '-') //若帶負號,則取出數字部分
{
nega_s1 = true;
s1 = s1.substr(1); //將第一位開始的部分重新賦給s
}
if(s2[0] == '-')
{
nega_s2 = true;
s2 = s2.substr(1);
}
char unit, decade = '0';
int a,b;
string result_one[s2.size()]; //保存中間的s2的每一位乘s1的結果
for(i = s2.size()-1; i >= 0; i--) //模擬相乘過程
{
a = s2[i] - '0';
for(j = s1.size()-1; j >= 0; j--)
{
b = s1[j] - '0';
unit =((a * b) + decade - '0') % 10 + '0' ; //保存兩個數字相乘的個位、十位
decade = ((a * b) + decade - '0') / 10 + '0';
result_one[s2.size() -1- i] = unit + result_one[s2.size() -1- i] ;
}
if(decade != '0')
result_one[s2.size() -1- i] = decade + result_one[s2.size() -1- i];
decade = '0';
}
for(i = 0; i < s2.size(); i++) //對中間結果補齊位數
{
for(j = i;j > 0; j--)
{
result_one[i] = result_one[i] + '0';
}
}
string sum = "0"; //用sum變量保存最終結果
for(i = 0;i < s2.size(); i++)
{
sum = count_add(sum,result_one[i]); //相加
}
int tip = 0;
for(i = 0; i < sum.size(); i++) //找出非零的起始位置
{
if(sum[i] == '0' )
{
tip ++;
}
else
break;
}
if(nega_s1 + nega_s2 == 1) //輸出符號
cout<<"-";
for(i = tip ; i < sum.size(); i++) //輸出數字部分答案
{
cout<<sum[i];
}
if(tip == sum.size())
cout<<"0";
return 0;
}
補充:輸出進行了一定處理,防止輸出0001這樣的結果(即不輸出數字開始的0)
運行截圖如下

再試試真正的大數相乘

