其實不是很了解為啥規定用struct寫。這題本質就是大數運算。
我add function因為怕時間內做不完當時是先拿下面網址的code改來用,之後有空應該會重新寫一次......
reference:How to get the sum of two strings of numbers - C++
#include <iostream>
#include <string>
using namespace std;
struct BigInt
{
string numberArray;
int length;
};
BigInt Add(const BigInt &na, const BigInt &nb)
{
string a = na.numberArray, b = nb.numberArray;
if (a.size() < b.size()) // make sure a is always longer.
swap(a, b);
int j = a.size() - 1;
for (int i = b.size() - 1; i >= 0; i--, j--) // 從個位數開始相加
a[j] += (b[i] - '0');
for (int i = a.size() - 1; i > 0; i--)
{
if (a[i] > '9') // make sure each digit is smaller than 10
{
int d = a[i] - '0';
a[i - 1] = ((a[i - 1] - '0') + d / 10) + '0';
a[i] = (d % 10) + '0';
}
}
if (a[0] > '9') // 如果最高位需要進位的處理
{
string k;
k += a[0];
a[0] = ((a[0] - '0') % 10) + '0'; // 取個位數
k[0] = ((k[0] - '0') / 10) + '0'; // 取十位數
a = k + a; // append
}
BigInt result;
result.numberArray = a;
return result;
}
int checkInput(string &number)
{
int check = 0;// if check is 1, then it is invalid input.
for (int i = 0; i < number.size(); i++)
{
if (!isdigit(number[i]))
{
return 1;
}
}
return 0;
}
int main() {
BigInt a, b, result;
string n1, n2;
int n;
while (cin >> n)
{
for (int i = 0; i < n; i++) // input data
{
cin >> n1 >> n2;
if (checkInput(n1) || checkInput(n2))
{
cout << "Not a valid number, please try again." << endl;
continue;
}
a.numberArray = n1;
a.length = n1.size();
b.numberArray = n2;
b.length = n2.size();
result = Add(a, b);
cout << result.numberArray << endl;
}
}
return 0;
}
補上自己重寫一遍的程式碼
#include <iostream>
#include <string>
using namespace std;
struct BigInt
{
string number;
};
BigInt add(BigInt &a, BigInt &b)
{
string n1 = a.number, n2 = b.number;
if (n1.size() < n2.size())
swap(n1, n2);
int len1 = n1.size(), len2 = n2.size(), j = len1-1; // j is bottom index of n1
for (int i = len2-1; i >= 0; i--, j--) // 把n2先直接加上n1
{
n1[j] += (n2[i] - '0');
}
for (int i = len1 - 1; i > 0; i--) // 除了 index 0 ,其餘都檢查是否需要進位
{
if (n1[i] > '9')
{
n1[i] = (n1[i] - '0') % 10 + '0';
n1[i - 1] += 1;
}
}
if (n1[0] > '9')
{
string append = "1";
n1[0] = (n1[0] - '0') % 10 + '0';
append = append + n1;
n1 = append;
}
BigInt result;
result.number = n1;
return result;
}
int checkInput(string numberArray)
{
for (int i = 0; i < numberArray.size(); i++)
{
if (!isdigit(numberArray[i]))
return 0;
}
return 1;
}
int main()
{
BigInt a, b;
while (cin >> a.number >> b.number)
{
if (checkInput(a.number) && checkInput(b.number))
{
BigInt result = add(a, b);
cout << result.number << endl;
}
else
cout << "Not a valid number, please try again." << endl;
}
return 0;
}
沒有留言:
張貼留言