PTA 乙级 1074 宇宙无敌加法器 (20 分) C++
好久没更了,不是我忘了,实在是觉得PTA的题有些部分出的很***钻,并且不打算考PTA,就当做着玩玩
首先 N > 20,为大数运算,首先确定存储数据的变量为字符串(用整型存储会导致测试点3,4无法通过)
之后每位的和的进位计算不难
有几个需要注意的点
- 最高位加和后,注意进位一定也要再做处理(测试点1)
- 注意结果为0的情况(测试点5)
- 字符串前导0的去除
- N中的0表示十进制
C++
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 int main() { 7 string n, pta1, pta2, sum; 8 int carry = 0; 9 cin >> n >> pta1 >> pta2; 10 while(pta1.size() < n.size()) pta1 = '0' + pta1; 11 while(pta2.size() < n.size()) pta2 = '0' + pta2; 12 for(int i = n.size() - 1; i >= 0; --i){ 13 //进制 14 int scale = n[i] - '0'; 15 if(scale == 0) scale = 10; 16 //取出两数需要处理的位 17 int rem1 = pta1[i] - '0', rem2 = pta2[i] - '0'; 18 //此时得到的和为逆序 19 sum += to_string((rem1 + rem2 + carry) % scale); 20 //计算进位 21 carry = (rem1 + rem2 + carry) / scale; 22 } 23 //最高位相加后剩余的进位 24 if(carry != 0) sum += to_string(carry); 25 //舍去前导零 26 while(sum.back() == '0' && sum.size() > 1)sum.pop_back(); 27 cout << string(sum.rbegin(), sum.rend()); 28 return 0; 29 }
默默地一点点变强,细节决定成败