1111~1115
1113 很難,看了題解
人類習慣用 10 進制,可能因為大多數人類有 10 根手指頭,可以用于計數。這個世界上有一種叫“錢串子”(學名“蚰蜒”)的生物,有 30 只細長的手/腳,在它們的世界里,數字應該是 30 進制的。本題就請你實現錢串子世界里的加法運算。
輸入格式:
輸入在一行中給出兩個錢串子世界里的非負整數,其間以空格分隔。
所謂“錢串子世界里的整數”是一個 30 進制的數字,其數字 0 到 9 跟人類世界的整數一致,數字 10 到 29 用小寫英文字母 a 到 t 順次表示。
輸入給出的兩個整數都不超過?105?位。
輸出格式:
在一行中輸出兩個整數的和。注意結果數字不得有前導零。
輸入樣例:
2g50ttaq 0st9hk381
輸出樣例:
11feik2ir
思想:
1、統一字符串長度,把較短串用前導0填充。這里可以把處理短串固定位A串,用swap(a,b)交換兩個字符串
2、把當前位轉換成十進制進行計算,再把結果轉換為十進制。用cur記錄當前位,join記錄進位
3、不要忘記處理最高位進位位
4、去除結果的前導0,輸出結果字符串
代碼:
//
// main.cpp
// PAT_1113_錢串子的加法
//
// Created by 徐精澤 on 2024/3/2.
//#include <iostream>
using namespace std;int main() {//轉換成十進制運算,再轉回30進制string A,B;cin>>A>>B;if(A.size()>B.size()) //保證A為短串swap(A,B); //交換兩個字符串for(int i=0;i<B.size()-A.size();i++){ //用前導0填充短串A='0'+A;}string ans; //定義結果串ans.resize(A.size()); //resize()改變結果串的大小用null填充int join=0;for(int i=(int)A.size()-1;i>=0;i--){int a,b;if('0'<=A[i]&&A[i]<='9')a = A[i]-'0';else{a = 10+A[i]-'a';}if('0'<=B[i]&&B[i]<='9')b = B[i]-'0';else{b = 10+B[i]-'a';}int sum = a+b+join; //十進制計算和int cur = sum%30; //模30得當前位join = sum/30; //得到進位位if(cur>=0&&cur<=9)ans[i]='0'+cur;elseans[i]='a'+cur-10;}if(join>0) ans='1'+ans; //別忘記處理最高位進位//處理結果前導0int index=0;while(index<ans.size()-1&&ans[index]=='0')index++;//輸出for(int i=index;i<ans.size();i++)cout<<ans[i];//如果結果為0,即0+0=0 ,測試點3cout<<endl;return 0;
}