进制转换问题: 输入一个进制a,输入一个a进制的数字n,再输入一个进制b(已知a和b不超过32) 输出这个数字的b进制的形式 输入: 2 11111111 16 输出: ff ------ a和b以数字形式存储,数字n用字符串存储 函数1:将a进制数字转换成十进制 16进制2f5 2*16^2+f*16^1+5*16^0 2*256+15*16+5*1 757 函数2:将十进制数字转换成b进制 2|75 1 2|37 1 2|18 0 2| 9 1 2| 4 0 2| 2 0 2| 1 1 0 #include <iostream> #include <cmath> using namespace std; //方案1:使用时计算 int getten(char c){ if(c>='0'&&c<='9') return c-'0'; if(c>='a'&&c<='z') return c-'a'+10; return -1;//输入不正确 } char getr(int p){ if(p<10) return (char)(p+48); else if(p<32) return (char)(p+97-10); return 0;//输入不正确 } //方案2:提前初始化 int num[128]={}; char jz[128]={}; void init(){ for(int i=48;i<=57;i++) num[i]=i-48; for(int i=97;i<=122;i++) num[i]=i-97+10; //使用时 num[c] 就相当于代表的数字 for(int i=0;i<=9;i++) jz[i]=i+48; for(int i=10;i<32;i++) jz[i]=i+97-10; ///使用时 jz[p] 就相当于数字代表的字符 } int atoten(string n,int a){ int sum=0; int j=0; for(int i=n.size()-1;i>=0;i--){ sum+=num[n[i]]*pow(a,j++);//方案2 //sum+=getten(n[i])*pow(a,j++);//方案1 } return sum; } string tentob(int m,int b){ int sta[1000]={},top=0,bottom=0; while(m){ sta[top++]=m%b; m/=b; } string numb=""; while(top!=bottom){ numb+=jz[sta[top-1]]; top--; } return numb; } int main(){ init(); int a,b; string n; cin>>a>>n>>b; int m=atoten(n,a); string s=tentob(m,b); cout<<s; return 0; } ------ 括号匹配问题: |