任意进制转换成十进制
按权展开,逐级求和。
二进制转十进制就是权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; }