1022 D进制的A+B (20分)
1022 D进制的A+B (20分)
输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
代码讲解 :刚开始看到这个题的时候我上来就觉得这不是就是递归吗,三下五除二,就用递归写了一个。
总有俩个测试点过不去我冥思苦想,忽然想到是不是系统栈不够用了,我测了一下大数,发现负数,我明白了
当进制很小的时候溢出了,我换成long long 还是不行数位太多,最后想了想我干嘛要一定让它保存输出呢
一个一个输出不就完了吗,而且编码很容易。
#include<stdio.h> //错误版本
int f(int n,int d)
{
int q=n/d;
int r=n%d;
if(q==0)
{
return r;
}
else
{
return 10*f(q,d)+r;
}
}
{
int q=n/d;
int r=n%d;
if(q==0)
{
return r;
}
else
{
return 10*f(q,d)+r;
}
}
int main()
{
int a,b;
int d;
while(scanf("%d %d %d",&a,&b,&d)!=EOF)
printf("%d\n",f(a+b,d));
return 0;
}
{
int a,b;
int d;
while(scanf("%d %d %d",&a,&b,&d)!=EOF)
printf("%d\n",f(a+b,d));
return 0;
}
#include<stdio.h> //递归版本
void f(int n,int d)
{
int q=n/d;
int r=n%d;
if(q==0)
{
printf("%d",r);
}
else
{
f(q,d);
printf("%d",r);
}
}
{
int q=n/d;
int r=n%d;
if(q==0)
{
printf("%d",r);
}
else
{
f(q,d);
printf("%d",r);
}
}
int main()
{
int a,b;
int d;
while(scanf("%d %d %d",&a,&b,&d)!=EOF)
{
f(a+b,d);
printf("\n");
}
return 0;
}
{
int a,b;
int d;
while(scanf("%d %d %d",&a,&b,&d)!=EOF)
{
f(a+b,d);
printf("\n");
}
return 0;
}
#include<stdio.h> //正确数组版本
int main()
{
int a,b;
int d;
int q,r;
int m[100];
int count;
while(scanf("%d %d %d",&a,&b,&d)!=EOF)
{
count=0;
a=a+b;
q=a/d;
r=a%d;
if(q==0)
{
printf("%d\n",r);
continue;
}
while(q)
{
m[count++]=r;
r=q%d;
q=q/d;
}
m[count++]=r;
int i;
for(i=count-1;i>=0;i--)
printf("%d",m[i]);
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号