遇到一个非十进制的数字时,我们总会想着先将他变成十进制
比如说这样子:
#include<stdio.h>
int main(){
int n;
char s[10086];
scanf("%d",&n);
scanf("%s",s);
int j=0;
int a[10086]={0};
int i=0;
while(s[j]!='\0'){
if(s[j]>='0'&&s[j]<='9'){
a[i]=s[i]-'0';//字符串和数字之间的转换
}else {
a[i]=s[i]+10-'A';//如果是超过十进制时会有大写字母
}i++;
j++;
}int sum=0;
for(int k=0;k<i;k++){
sum=sum*n+a[k];//之所以乘n可以通过类比十进制来理解
}printf("%d",sum);
return 0;
}
大概思路就是用字符串的数组储存输入的数字(或者还有一些字母),然后将其转换成int 类型的数字,再相加输出。
如果要用十进制得到一个别的进制的数字,我们可以将这个过程倒过来
比如说这样子:
#include<stdio.h>
int a[1008600]={0};
void yvn(int n,int r){
{
char b[1008600];
int k=0;
while(n>=r){
int x=n%r;
n/=r;
if(x<10)
b[k]=x+'0';
else
b[k]=x-10+'A';
k++;
}k--;
if(n!=0){
k++;
if(n>9)
b[k]=n-10+'A';
else
b[k]=n+'0';
}for(int y=k;y>=0;y--)
printf("%c",b[y]);
}
}
int main(){
int n;
scanf("%d",&n);
int r;
scanf("%d",&r);
yvn(n,r);
return 0;
}
然后将一个进制转成另一个进制我们就可以将上述两个结合起来
就会变成这样子:
#include<stdio.h>
#include<string.h>
int main(){
int n,m;
char a[10086];
scanf("%d",&n);
getchar ();
scanf("%s",a);
scanf("%d",&m);
//int i=0;
int k=0;
int sum=0;
int len=strlen(a);
for(k=0;k<len;k++){
sum=sum*n;
if(a[k]>='0'&&a[k]<='9') sum+=a[k]-'0';
else sum+=a[k]-'A'+10;
}
char b[10086]={'0'};
int num=0;
while(sum>m){
int t=sum%m;
if(t>10) b[num++]=t-10+'A';
else b[num++]=t+'0';
sum/=m;
}if(sum)
if(sum>10) b[num]=sum-10+'A';
else b[num]=sum+'0';
else num--;
for(int y=num;y>=0;y--) printf("%c",b[y]);
return 0;
}
通过这样的方法我们就能将一个n进制的数字转换成m进制的数字了!
(第一次写博客,有不足请多多包涵)