大整数任意进制转换

    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <iostream>
    using namespace std;
    char str[1000];//输入字符串
    int start[1000],ans[1000],res[1000]; //被除数,商,余数

    //转换前后的进制
    static int oldBase ;
    static int newBase ;

    void change()
    {//各个数位还原为数字形式
        int i,len = strlen(str);
        start[0] = len;
        for(i=1;i<= len;i++)
        {
            if(str[i-1] >= '0' && str[i-1] <= '9')
            {
                start[i] = str[i-1] - '0';
            }
        }
    }

    void solve()
    {
        memset(res,0,sizeof(res));//余数初始化为空
        int y,i,j;
        //模n取余法,(总体规律是先余为低位,后余为高位)
        while(start[0] >= 1)
        {//只要被除数仍然大于等于1,那就继续“模2取余”
            y=0;
            i=1;
            ans[0]=start[0];
            //
            while(i <= start[0])
            {
                y = y * oldBase + start[i];
                ans[i++] = y/newBase;
                y %= newBase;
            }
            res[++res[0]] = y;//这一轮运算得到的余数
            i = 1;
            //找到下一轮商的起始处
            while((i<=ans[0]) && (ans[i]==0)) i++;
            //清除这一轮使用的被除数
            memset(start,0,sizeof(start));
            //本轮得到的商变为下一轮的被除数
            for(j = i;j <= ans[0];j++)
                start[++start[0]] = ans[j];
            memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备
        }
    }

    void output()
    {//从高位到低位逆序输出
        int i,j;
        char answer[1000];

        memset(answer,0,sizeof(answer));
        for(i = res[0],j=0;i >= 1;j++,--i)
        {
            answer[j]=res[i]+'0';
           // printf("%d",res[i]);
        }
        string answerstr(answer);
       // printf("%s",answer);
        cout<<answerstr;
        printf("\n");
    }

int main()
{
    while(1)
    {
        printf("----请输入要转换的数  :  ");
        scanf("%s",str);
        printf("----请输入当前进制    :  ");
        scanf("%d",&oldBase);
        printf("----请输入要转换的进制:  ");
        scanf("%d",&newBase);
        change();
        solve();
        printf("----转换成的%d进制数是:  ",newBase);
        output();
    }

    return 0;
}


参考https://www.cnblogs.com/walkthehorizon/p/4388137.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值