p1099 进制转换

版权声明: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;
	
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84439271
今日推荐