中石油新生第三次训练赛 C题进制转换(奇葩解)

题目描述

乐乐正在学进制转换,但他老是搞不清楚到底自己是否做对,请你编一程序实现两种不同进制之间的数据转换,帮他检验。

输入

共有三行,第一行是一个正整数,表示需要转换的数的进制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+原字符串的进制
返回的是一个长整型数。
如果还想了解更多可以自行百度。

扫描二维码关注公众号,回复: 4573941 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_43332389/article/details/84944729