1. 程式人生 > >中石油新生第三次訓練賽 C題進位制轉換(奇葩解)

中石油新生第三次訓練賽 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+原字串的進位制
返回的是一個長整型數。
如果還想了解更多可以自行百度。