版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84439271
题目
描述 Description
请你编一程序实现两种不同进制之间的数据转换。
输入格式 Input Format
输入数据共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A~F表示数码10~15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。
输出格式 Output Format
输出仅一行,包含一个正整数,表示转换之后的m进制数。
样例输入 Sample Input
16
FF
2
样例输出 Sample Output
11111111
时间限制 Time Limitation
1s
注释 Hint
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int or2De(char a[], int base)/*定义一个函数 original to decimal 原始转十进制,
两个参数 一个a【】是一维数组,代表输入的字符,一个是 base,代表着输入字符的进制 */
{
int length = strlen(a);/* 计算这个数组的长度*/
int i, b=1, sum=0;/*定义三个局部变量,i为数组下标,b=1,
实际上可以看成进制的0次方,每循环一次,进制就平方一次,
sum是整个数组通过进制相乘得到的十进制整数,初始为0*/
for (i=length-1; i>=0;i--)
/* 进行循环,从字符的最后面一位开始计算,比如一个字符F8E,这个16进制的字符长度为3,
第0位是F,第1位是8,第2位是E,则从E开始计算,即计算a[2]
,如果a[i]中的字符要转换成数字,需要用ascII码值,字符0为48,A为65,如果E要转成成数字,
就要自己对应的ascii码69-65+10=14,在整个循环体中,
如果把上面的F8E当成样例,需要循环三次,第一次计算a[2],字符为e,
值为sum+(’E‘-’A‘+10)*1=0+14=14,再进行第二次计算的时候,
变量b从进制的0次方变成进制的1次方,数组下标从2变成1
第二次计算a[1]即8,值为sum=sum+(’8‘-’0‘)*b,整个时候式子后边的sum为第一次循环后的值为14,
b为进制的1次方为16,所以结果为14+8x16,然后进行第三次循环,
第三次循环之前,b变量变成进制的二次方,i变成0,
我们进行第三次循环进行计算F,sum=sum+(’F‘-’A‘+10)*b,式子后边的sum为14+8x16,
b的进制为16的二次方,则最后的
sum=14+8x16+15x16x16=3982*/
{
if (a[i]>='A')
{
sum = sum + (a[i]-'A'+10)*b;
b = b*base;
}
else
{
sum = sum+(a[i]-'0')*b;
b = b*base;
}
}
return sum;/*函数返回最后的十进制数,即sum的值*/
}
void de2N(int decimal, int m)/*定义一个无返回值的函数 decimal to N base,
十进制转换为n进制的函数,两个变量,一个是decimal,
它的值是函数or2De的返回值,在主程序中可以直接调用函数给decimal赋值,
式子为 decimal = or2De(a,n),其中a为你输入的字符实参对应函数的形参a[],n
为输入的进制,对应的形参为base*/
{
int r[500];/*定义一个一维数组存放余数*/
int j=0;/*数组的下标*/
int quotient=decimal;/*把十进制数赋值给变量 商*/
while (quotient!=0)/*当商不为0的时候循环一直执行*/
{
r[j]=quotient%m;/*数组中的第一个元素为商求余的余数,放入r[0]*/
j=j+1; /*下标加1,以便下一个余数放入r[1]*/
quotient=quotient/m;/*商变成了原来十进制数*/
}
for (int i=j-1;i>=0;i--)/*用一个for循环逆序输出上面定义的那个r[]数组,
因为你上次放入r[0]的那个余数实际上是真实二进制数的最后一位,我们输出是从r[j-1]到r[0]*/
{
if(r[i]>=10)
{
printf("%c", r[i]-10+'A');/*如果余数大于10,比如15,那就15-10+‘A’=70,
通过printf输出char字符F*/
}
else
{
printf("%d", r[i]);/*如果余数小于10,输出整型即可*/
}
}
}
int main()
{
int n;/*定义一个整形,代表着初始值的进制*/
char a[500];/*定义一个数组,存放你输入的初始值*/
int m;/*定义一个整形,代表初始值的目标进制*/
int decimal; /*定义一个整型,代表着你初始值转成的十进制,
将or2De这个函数的返回值赋值给decimal即可*/
cout<<"请输入初始数值的进制"<<endl;
scanf("%d",&n); /*输入一个进制*/
cout<<"请输入初始数值"<<endl;
scanf("%s",&a);/*输入初始值,类型为字符串*/
cout<<"请输入初始数值的目标进制"<<endl;
scanf("%d",&m);/*初始值要转换的进制*/
decimal=or2De(a,n);/*调用函数or2De赋值给decimal*/
de2N(decimal,m);/*调用函数de2N执行decimal的目标进制转换*/
return 0;
}