C语言PAT刷题 - 1022 D进制的A+B

作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答;
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。

一、题目描述
输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103

二、解题思路
读题:

接收三个非负整数A、B、D (A,B≤230−1;1<D≤10),计算A+B的值并转换成D进制数,将这个结果输出即可。
10进制转N进制的方法(1<N<=10):除N取余,逆向排序。
如:十进制数13转二进制数:
1.13/2=6……1
2.6/2=3……0
3.3/2=1……1
4.1/2=0……1
通过上述4个步骤得到四个余数,依次是1011,将他们逆向排序,得到1101,这就是十进制数13转二进制后的结果。
思路:
1.定义需要的变量并接收三个非负整数A、B、D存到变量a,b,d中;
2.令A和B相加,结果储存到变量c中;
3.由十进制转N进制的步骤可知,转换过程实际上就是一个待转换数c不断除以N,结果储存在c中,余数另外储存,直到c/N=0才结束的一个循环。按照这个规则设置循环,循环条件为c/d!=0(程序中用变量d储存进制N),循环体是取余和除法运算;
4.上述循环结束后,c/d=0,但是这个除法运算可能会有余数,由于上述循环已经结束,所以此时的余数需要另外设置一个语句计算出余数并储存起来;
5.设置循环,把按顺序储存起来的余数逆序输出,结果便是待转换数转换进制后得到的数字。

三、具体实现
0.标准C源程序框架

#include <stdio.h>
int main()
{
	return 0;
}

1.定义需要的变量并接收三个非负整数A、B、D存到变量a,b,d中;

    int a, b, c, d;//a,b,d储存加数A,B和进制数D,c储存a,b相加之和
    int i = 0;//循环变量
    int arr[32] = { 0 };//储存余数
    scanf("%d%d%d", &a, &b, &d);

2.令A和B相加,结果储存到变量c中;

    c = a + b;

3.由十进制转N进制的步骤可知,转换过程实际上就是一个待转换数c不断除以N,结果储存在c中,余数另外储存,直到c/N=0才结束的一个循环。按照这个规则设置循环,循环条件为c/d!=0(程序中用变量d储存进制N),循环体是取余和除法运算;

    while (c / d != 0)//13/2 6 3 1 0
    {
        arr[i] = c % d;//储存当轮循环的余数,循环结束时余数就是按除法顺序排列的
        c /= d;//c完成一次除法运算后要把结果储存到c中,更新c的值
        i++;//用于循环迭代
    }

4.上述循环结束后,c/d=0,但是这个除法运算可能会有余数,由于上述循环已经结束,所以此时的余数需要另外设置一个语句计算出余数并储存起来;

    arr[i] = c % d;

5.设置循环,把按顺序储存起来的余数逆序输出,结果便是待转换数转换进制后得到的数字。

    while (i >= 0)
    {
        printf("%d", arr[i--]);
    }

四、测试数据
程序较简单,没发现什么重要的测试数据。做这种题主要就先关注一下接收a,b时用什么数据类型,两个数字会不会太大,超出变量范围;后面相加又会不会超出变量范围。幸运的是这道题比较宽容,没有埋可能会超出范围的陷阱,但是还是要留意。
另外就是可能有些朋友对进制转换不太了解,可以去百度深入了解一下。
五、全部代码

#include <stdio.h>
int main()
{
    int a, b, c, d;//a,b,d储存加数A,B和进制数D,c储存a,b相加之和
    int i = 0;//循环变量
    int arr[32] = { 0 };//储存余数
    scanf("%d%d%d", &a, &b, &d);
    c = a + b;
    while (c / d != 0)//13/2 6 3 1 0
    {
        arr[i] = c % d;//储存当轮循环的余数,循环结束时余数就是按除法顺序排列的
        c /= d;//c完成一次除法运算后要把结果储存到c中,更新c的值
        i++;//用于循环迭代
    }
    arr[i] = c % d;
    while (i >= 0)
    {
        printf("%d", arr[i--]);
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值