題目:將m進制數X,轉換為n進制數輸出
輸入:輸入的第一行包括兩個整數:M和N(2<=M,N<=36),下面的一行輸入一個數X,X是M進制的數,現在要求你將M進制的數X轉換為N進制的數輸出,
輸出:輸出X的N進制表示的數,
樣例輸入
10 2
11
樣例輸出
1011
提示:注意輸入時如有字母,則字母為大寫,輸出時如有字母,則字母為小寫,
AC代碼如下:
#include<stdio.h>
#include<string.h>
int main(){
int m,n,i,len,s1[110];
char s[110],ans[110];
char map[]={"0123456789abcdefghijklmnopqrstuvwxyz"};
while(~scanf("%d%d",&m,&n)){
memset(s1,0,sizeof(s1));
memset(ans,0,sizeof(ans));
scanf("%s",s);
len=strlen(s);
//如果輸入的為0,則輸出也為0
if(len==1&&s[0]=='0'){
printf("0\n");
continue;
}
//將輸入的字串每一位數轉換為對應十進制數存盤在陣列s1中
for(i=0;i<len;i++){
if(s[i]>='0'&&s[i]<='9')
s1[i]=s[i]-'0';
if(s[i]>='A'&&s[i]<='Z')
s1[i]=s[i]-'A'+10;
}
int k=0;
while(1){
int flag=0;
for(i=0;i<len;i++){
if(s1[i]!=0){
flag=1;
break;
}
}
//如果s1[i]中所有數都為0,則終止
if(flag==0)
break;
//利用輾轉相除法
int sum=0;
for(i=0;i<len;i++){
sum=sum*m+s1[i];//相當于將m進制轉換為10進制按權展開
sum%=n;//相當于10進制轉任意進制的求余
}
ans[k++]=map[sum];//找到最終余數在map陣列中的字符并保留結果
int sum1=0;
for(i=0;i<len;i++){
s1[i]+=sum1*m;
sum1=s1[i]%n;
s1[i]/=n;
}
}
for(i=k-1;i>=0;i--)//輸出結果
printf("%c",ans[i]);
printf("\n");
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/142000.html
標籤:其他
