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