题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344
我的思想:
先把每个输入的数转换成相应的进制,然后相加,并且判断进位,(太麻烦了)
算法笔记的思路是:先把两个数相加,然后转换进制
未AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=1000010;
int a[maxn];
int main(){
long long int num_1,num_2;
int base;
scanf("%lld%lld%d",&num_1,&num_2,&base);
long long int sum=num_1+num_2;
int i=0;
while(sum){
a[i++]=sum%base;
sum/=base;
}
for(int j=i-1;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=32;//最大31位
int a[maxn];
int main(){
int num1,num2,base;
scanf("%d%d%d",&num1,&num2,&base);
int num=num1+num2;
int i=0;
do{
a[i++]=num%base;
num/=base;
}while(num);
for(int j=i-1;j>=0;j--){
printf("%d",a[j]);
}
return 0;
}
两者差距是一个用了while循环,取特殊情况sum=0,则无法处理(自我感觉),初始化a数组为0,也不行
一个用了do-while循环
二刷:(上面提的老毛病,但还是坚持写完了)
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string A,B,C;
int jinzhi,i;
cin>>A>>B>>jinzhi;
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
int carry=0;
for(i=0;i<A.size()||i<B.size();i++){
int signal_add=(A[i]-'0')+(B[i]-'0')+carry;
carry=signal_add/10;
signal_add%=10;
C+=(signal_add+'0');
}
if(carry)
C+=(carry+'0');
reverse(C.begin(),C.end());
int c=atoi(C.c_str());
int a[32];//a数组没必要设的太大
i=0;
do{
a[i++]=c%jinzhi;
c/=jinzhi;
}while(c);
for(int j=i-1;j>=0;j--){
printf("%d",a[j]);
}
return 0;
}