九度 题目1208:10进制 VS 2进制

本文详细介绍了如何通过分步操作实现十进制数到其二进制逆序数的转换,包括将十进制数转换为二进制数并逆序,以及将逆序的二进制数转换回十进制数的过程。通过具体算法解析和代码实现,旨在解决复杂数值转换问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

    对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
    例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

输入:

    一个1000位(即10^999)以内的十进制数。

输出:

    输入的十进制数的二进制逆序数。

样例输入:
173

样例输出:181


以上是题目的叙述!初看这道题觉得此题很简单,以为水题一道!但是真正做的时候却错误百出!最终花了我3个小时才最终搞定!

我的思路是分两步:1.将十进制数转换成2进制数;

2.将2进制旋转的数转换成新的十进制数;

因为题目中说输入不超过1000位,可以得出这是大整数的操作!然后第一步就是将大整数转换成2进制数,这一步很简单,只要大整数末位循环取余2,将结果保存在新的字符数组中即可!此时得到的2进制数已经相当于是反转过的2进制数了,然后再怎么将其转换成新的十进制数呢?不能用常规的每位的数乘以此数的位数,这样的话2^n有可能是溢出的,因为是大整数啊!所以只能循环每一位都乘2,再将结果继续每位都乘2。。。

具体算法如下:

#include <stdio.h>
#include <string.h>
char ch1[1000],ch2[4000]; //ch1保存用户输入的10进制大整数,ch2保存ch1转换后的翻转的2进制
int num[1000]; //保存ch2转换的新的2进制大整数!
void Ten_two_convers(){ //十进制数转换成2进制数
      int len = strlen(ch1);
        int sum = 1;
        int flag = 0;
        int a;
        int b;
        while(sum){ //循环,当ch1字符数组每位都是0的时候,循环结束
            b = 0;
            sum = 0;
            ch2[flag++] = (ch1[len-1] - '0')%2 + '0';
            for(int i = 0; i < len; i++){
                if(b == 0){
                    a = (ch1[i] - '0');
                    ch1[i] = a/2 + '0';
                }else{
                    a = ch1[i] - '0' + 10;
                    ch1[i] = a/2 + '0';
                }
                if(a%2 == 0){    //此处一定是a%2,一开始写的是ch1[i]%2,忘记了ch1[i]
                    b = 0;
                }else{
                    b = 1;
                }
                sum = sum + a/2;
            }
        }
}
int Two_ten(){  //2进制数转换成10进制数!!!!!!这个思路是借鉴了这种思想:比如2进制1010 =(((0*2+1)*2+0)*2+1)*2+0=10

    int len2 = 1;
        num[0] = 0;
        for(int i = 0; i < strlen(ch2); i++){
            for(int j = 0; j < len2; j++ ){ //各位循环乘2
                if(j == 0){
                    num[j] = num[j] * 2 + ch2[i] - '0';
                }else{
                    num[j] = num[j] * 2;
                }
            }
            for(int j = 0; j < len2; j++){
                if(j == len2 - 1&&num[len2-1] >= 10){
                    num[j] = num[j]%10;
                    num[++j] = 1; //超过10就进位
                    len2++;  //扩大一位
                    }else if(num[j] >= 10){
                        num[j] = num[j]%10; //超过10就进位
                        num[j+1]++;
                }
            }
        }
        return len2;
}
int main(){
    while(scanf("%s",ch1) != EOF){
        memset(ch2,0, sizeof(ch2));  //将ch2清空
        Ten_two_convers();
        int len2 = Two_ten();
        for(int i = len2-1; i >= 0; i--){ //最后不要忘了把数组中的数从后向前输出!!!!
            printf("%d",num[i]);
        }
        printf("\n");
    }
    return 0;
}

到此这道题完成!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值