问题 C: 进制转换

题目链接
这道题进制转换并不难,也不需要转成含有字母的进制。但是他给出的数据是30位的,其数据大小远远超过了int ,long long所指的范围。我们只能运用数组,来手动模拟进制转换的过程。
核心思想:
先将这个数输进数组中,然后将其每个字符转化为整型,然后就开始逐步除,从最后一位开始,不断除2取余,并存放在新数组中,但是对于前面的数,要从第一位开始进行一个判断,先将他们都除以2,然后判断该位是不是偶数,如果是偶数,也就意味着可以除尽,不会有余数产生,这时置q=0;否则,如果为奇数,则意味着会余1给下一位,所以这时候下一位要加10在进行除法运算,直i从0开始,直到i位置处的数为0 ,i++,一直循环到i==len跳出。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
 
int main()
{
    char a[35];
    while(scanf("%s",&a)!=EOF)
    {
        int q=1,num=0;
        int b[35]={0};//用来存放将a中的字符型转化为int 型数据
        int len=strlen(a);
        for(int i=0;i<len;i++)
        {
            b[i]=a[i]-'0';//数组的每一个元素即为每一位数字
        }
        int temp,i=0;
        int z[100]={0};
        while(i<len)
        {
            int q=0;
            z[num++]=b[len-1]%2;//取的余数
            for(int j=i;j<len;j++)
            {
                temp=b[j];
                b[j]=(b[j]+q)/2;
                if(temp%2==0)//该位置存放的为偶数,可以直接除
                    q=0;
                else
                    q=10;//这里起到的作用是,eg:35-》17,模拟除法。并不影响最后一位的奇偶性,奇偶性只有最后一位本身决定,这里只是简单的进位除法。
            }
            if(b[i]==0)//eg:17-》9,十位上的数字已经不用在计算了,所以往下推,也是让这个循环条件i满足
                i++;
        }
        for(int k=num-1;k>=0;k--)
            printf("%d",z[k]);
        printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值