例4.2 又一版A+B - 九度教程第43题(进制转换)

又一版A+B - 九度教程第43题

题目:

时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
输入两个不超过整型定义的非负 10 进制整数 A 和 B(<=2^31-1),输出 A+B 的 m (1 < m <10)进制数。
输入:
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出 m 和 A,B 的值。 当 m 为 0 时输入结束。
输出:
输出格式:每个测试用例的输出占一行,输出 A+B 的 m 进制数
样例输入:
8 1300 48
2 1 7
0
样例输出:
2504
1000
来源:
2008 年浙江大学计算机及软件工程研究生机试真题

进制转换:

考虑一种较为特殊的数位拆解——进制转换。那是因为,进制转换与数位拆解一样,最终目的也是求各个数位上的数字。不同的是,数位拆解是:求十进制表示的数字各个数位上的数字,进制转换是:求以某种进制表示的数字用另一种进制来表示各个数位上的数字。

进制转换要完成的工作是:在各个进制表示特定数字的数字组之间相互转换。

如何完成进制转换

把从m进制转换到n进制转换为两个进制转换问题:

(1)从m进制转换到十进制

(2)再从十进制转换到n进制

这样,只需掌握十进制与其他进制的相互转换就可以完成任意进制间的转换了。

十进制转换为二进制:十进制数x,对x模2。 二进制->十进制:计算各个数位上的数字与该位权重的积。

 

(1)求十进制数xk进制:不断重复对x求余(模k),求商(除以k),即可由低到高依次得到各个数位上的数。

(2)求k进制->十进制:依次计算各个数位上的数字与该位权重的积,然后依次累加即可得到该十进制数。

解析:

此题:十进制->m进制。 不断对m取模求余、除以m

代码:

#include<stdio.h>
int main()
{
    long long a,b;  //使用数据类型long long确保不会溢出
    int m;
    while(scanf("%d",&m)!=EOF)
    {
        if(m==0) break;         //当m等于0时退出
        scanf("%lld%lld",&a,&b);//用%lld对long long变量赋值
        a=a+b;                  //计算a+b
        int ans[50],size=0;     //ans用来保存依次转换得到的各个数位数字的值,size表示其个数
        do{
            ans[size++]=a%m;    //对m求模
            a/=m;               //除以m
        }while(a!=0);           //当a不为0时重复该过程
        for(int i=size-1;i>=0;i--)
        {
            printf("%d",ans[i]);
        }                       //输出,注意顺序为从高位到地位
        printf("\n");           //输出换行
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_39450145

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值