任意进制转换成十进制

按权展开,逐级求和。
二进制转十进制就是权2
四进制转十进制就是权
4
八进制转十进制就是权8
十六进制转十进制就是权
16(a-z要特判也就是-'a'+1+9)

对于任意进制要区分是否大于10进制
当大于10进制时我们的 十进制之中的10 可以表示位 A ,11:B...
所以我们需要进行特殊处理而不能与十进制以下的转换混合操作。
在编写代码一定要注意尽量减少循环次数,每一次循环都会延长你的计算机运行该程序的时间.
以下个人思想所实现的代码,供大家参考,如有疑问请及时提出。

#include <iostream>
#include <algorithm>
using namespace std;
//输入一个任意进制的数转换为10进制
//当d低于十进制
int func(int x, int d)
{
    int ans = 0,index = 1;
    while (x)
    {
        int c = x % 10;
        ans += c * index;
        x = x / 10;
        index *= d;
    }
    return ans;
}
//当大于10进制时候
int transfer(string s, int d)
{
    int sum = 0,k = 1; //初始化
    for (int i = s.size() - 1; i >= 0; i--)
    {
        if (s[i] >= 'A' && s[i] <= 'Z')
        {
            sum += (s[i] - 'A' + 1 + 9)*k;
        }
        else
        {
            sum += (s[i] - '0') * k;
        }
        k *= d;
    }
    return sum;
}
//测试代码
int main()
{
    cout << transfer("BB1", 16) << endl;
    cout << transfer("A22", 32) << endl;
    cout << func(123, 8) << endl;
    cout << func(1001, 2) << endl;
    system("pause");
    return 0;
}

十进制转任意进制的通用方法是:除x取余倒排法(x代表进制数)。 

特殊的A+B
https://vjudge.net/problem/UVALive-4660

#include <iostream>
#include <algorithm>
using namespace std;
int a[100];

int jz(int m){
    int cnt=0,max=0;
    int i=0;

    while(m){
        cnt=m%10;
        i++;
        if(cnt>max){
            max=cnt;
        }
        m/=10;
    }
    return max+1;
}
int convert(int n,int jz){    
    int index=1;
    int ans=0;
    int m=n;
    int ws=0;

    while(m){
        a[ws]=m%10;
        m/=10;
        ws++;
    }

    for(int i=0;i<ws;++i){
        ans+=a[i]*index;
        index*=jz;
    }

    return ans;
}
int main(){
    int n, m, a, b, c;

    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        int t1=jz(n),t2=jz(m);
        a = convert(n,t1);
        b = convert(m,t2);
        c=a+b;
        printf("%d\n",c);
    }

    return 0;
}
全部评论

相关推荐

有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务