1022 D进制的A+B (20分)

1022 D进制的A+B (20分)
 

输入两个非负 10 进制整数 A 和 B (230​​1),输出 A+B 的 D (1<D10)进制数。

输入格式:

输入在一行中依次给出 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 main()
{
 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 main()
{
 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;
}





posted @ 2020-10-27 17:03  罪梦者  阅读(158)  评论(0)    收藏  举报