题目描述
乐乐正在学进制转换,但他老是搞不清楚到底自己是否做对,请你编一程序实现两种不同进制之间的数据转换,帮他检验。
输入
共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A~F表示数码10~15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。
输出
仅一行,包含一个正整数,表示转换之后的m进制数。
样例输入
16
FF
2
样例输出
11111111
没错,这个题就是可以如此暴力的直接解决。
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n,m;
char s[100],str[100];
scanf("%d %s %d",&n,s,&m);
itoa(strtol(s,NULL,n),str,m);
puts(str);
return 0;
}
介绍一下代码中的两个函数
1.itoa itoa是广泛使用的非标准C语言和C++语言扩展功能。但因为它是一个非标准的C / C++语言功能,因此不能好好的被所有编译器使用。在大多数Windows下的编译器通常在头文件包含非标准函数。
它的功能是 将任意类型的数字转换为字串子(来源百度)
也就是可以将十进制数转换成任意进制的字符串。
用法:char *itoa(int value,char *string,int radix);
int value 被转换的数字,char *string 转换后储存字符串的数组,int radix转换进制数,如2,8,10,16 进制等
但是要注意这是非标准库函数,在OJ不一定能过,如果报错说itoa没有被声明,请自行加入itoa的源代码
char *itoa(int num,char*str,int radix)
{ char index[]="0123456789ABCDEF";
unsigned unum;
int i=0,j,k;
if(radix==10&&num<0)
{
unum=(unsigned)-num;
str[i++]='-';
}
else unum=(unsigned)num;
do{
str[i++]=index[unum%(unsigned)radix];
unum/=radix;
}while(unum);
str[i]='\0';
if(str[0]=='-')k=1;
else k=0;
char temp;
for(j=k;j<=(i-1)/2;j++)
{
temp=str[j];
str[j]=str[i-1+k-j];
str[i-1+k-j]=temp;
}
return str;
2.strtol 函数
strtol函数会将参数nptr字符串根据参数base来转换成长整型数,参数base范围从2至36。
也就是把某进制字符串转换成十进制数。
用法long int strtol(const char *nptr,char **endptr,int base);
要转换的字符串+NULL+原字符串的进制
返回的是一个长整型数。
如果还想了解更多可以自行百度。