《编程思维与实践》 1001.进制转换
题目
思路
N = k n R n + k n − 1 R n − 1 + . . . + k 1 R + k 0 那么 R 进制所表示的数为 k n k n − 1 . . . . k 1 k 0 N R = k n R n − 1 + k n − 1 R n − 2 + . . . + k 1 该过程可进行 n 次 N % R = k 0 该过程可进行 n + 1 次 并且可以从后往前依次取出转换进制后每个位置的值 所以可以考虑用 d o w h i l e 循环来进行处理 先做一次取余运算 判断条件为 N = N R ! = 0 N=k_nR^n+k_{n-1}R^{n-1}+...+k_1R+k_0 \\ 那么R进制所表示的数为k_nk_{n-1}....k_1k_0 \\ \frac{N}{R}=k_nR^{n-1}+k_{n-1}R^{n-2}+...+k_1 \qquad 该过程可进行n次\\ N\%R=k_0 \qquad 该过程可进行n+1次 \quad 并且可以从后往前依次取出转换进制后每个位置的值\\ 所以可以考虑用do\quad while循环来进行处理\\ 先做一次取余运算\quad 判断条件为N=\frac{N}{R}!=0\\ N=knRn+kn−1Rn−1+...+k1R+k0那么R进制所表示的数为knkn−1....k1k0RN=knRn−1+kn−1Rn−2+...+k1该过程可进行n次N%R=k0该过程可进行n+1次并且可以从后往前依次取出转换进制后每个位置的值所以可以考虑用dowhile循环来进行处理先做一次取余运算判断条件为N=RN!=0
代码
#include<stdio.h>
void reverse(char *a,int n)
{
for(int i=0;i<n/2;i++)
{
char temp;
temp=a[i];
a[i]=a[n-i-1];
a[n-i-1]=temp;
}
}
int main()
{
int T;
scanf("%d",&T);
char number[32]; //最多32位 用来存储转换进制后的每个位置的数值
for(int i=0;i<T;i++)
{
int N,R,j=0,flag=1; //j是用来存number的下标,flag用来判断正负
scanf("%d %d",&N,&R);
if(N<0)
{
flag=-1;
N=-N;
}
do{
if(N%R<10){
number[j++]=N%R+'0';
}
else{
number[j++]=N%R+'A'-10; //大于10时用字母来表示
}
}while(N/=R);
number[j]='\0';
reverse(number,j); //数组元素反转
if(flag==-1)
{
printf("-");
}
for(int k=0;k<j;k++)
{
printf("%c",number[k]);
}
printf("\n");
}
return 0;
}
当然也可以不需要倒转数组,直接逆向输出:
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
char number[32]; //最多32位 用来存储转换进制后的每个位置的数值
for(int i=0;i<T;i++)
{
int N,R,j=0,flag=1; //j是用来存number的下标,flag用来判断正负
scanf("%d %d",&N,&R);
if(N<0)
{
flag=-1;
N=-N;
}
do{
if(N%R<10){
number[j++]=N%R+'0';
}
else{
number[j++]=N%R+'A'-10; //大于10时用字母来表示
}
}while(N/=R);
if(flag==-1)
{
printf("-");
}
for(int k=j-1;k>=0;k--)
{
printf("%c",number[k]);
}
printf("\n");
}
return 0;
}