将非负十进制整数n转换成b进制。(其中b=2~16)
算法思路:
使用字符数组存储每一位的元素,将整数num每次%b 就能得到当前位置上的b进制数,然后将num/b,再次进入函数递归调用,num==0时作为递归出口,我用了show()直接跳到另一个函数来结束递归调用。
//递归调用
void Transfer(int num /*要转换数*/, int b/*转换的进制*/, char last[]/*字符串*/, int unit/**/){
if (num == 0){
show(last, unit);
}
else{
int bite = num % b;
char bit = '0';
if (bite > 9){
bit = 'A' + (bite - 10);
last[unit] = bit;
}
else{
last[unit] = '0' + bite;
}
num /= b;
unit++;
Transfer(num, b, last, unit);
}
}
//非递归
void unTransfer(int num /*要转换数*/, int b/*转换的进制*/, char last[]/*字符串*/){
int bite;
char bit;
int i;
for (i = 0; num != 0; i++){
bite = num % b;
if (bite > 9){
last[i] = 'A' + (bite - 10);
}
else{
last[i] = '0' + bite;
}
num /= b;
}
show(last, i);
}
/*
这里用了字符数组,10进制往上就是字母ABC了
所以用字符会方便输出,然后根据ASCII码的特性,
当num%b大于9时存入的字符为‘A’+num%b,否则‘0’+numb。
每次num/b,unit++,进入下一次递归调用,
字符串也是地址传参,所以字符串内部的值也就直接改变了。
所以仅仅16行代码就可以完成进制转换。*/
完整代码:
#include<stdio.h>
#include<Windows.h>
#pragma warning(disable : 4996);
void show(char c[], int l){
for (int i = l-1; i >= 0; i--)
printf("%c", c[i]);
}
void Transfer(int num /*要转换数*/, int b/*转换的进制*/, char last[]/*字符串*/, int unit/**/){
if (num == 0){
show(last, unit);
}
else{
int bite = num % b;
char bit = '0';
if (bite > 9){
bit = 'A' + (bite - 10);
last[unit] = bit;
}
else{
last[unit] = '0' + bite;
}
num /= b;
unit++;
Transfer(num, b, last, unit);
}
}
void unTransfer(int num /*要转换数*/, int b/*转换的进制*/, char last[]/*字符串*/){
int bite;
char bit;
int i;
for (i = 0; num != 0; i++){
bite = num % b;
if (bite > 9){
last[i] = 'A' + (bite - 10);
}
else{
last[i] = '0' + bite;
}
num /= b;
}
show(last, i);
}
int main(){
int num, b;
char last[32];
int unit = 0;
printf("请输入你要转换的数:");
scanf("%d", &num);
printf("\n你想把他转换为几进制:");
scanf("%d", &b);
printf("\n原数为 %d ,转换为 %d 进制后的结果为\n", num , b );
printf("递归调用:");
Transfer(num, b, last, unit);
printf("\n非递归调用:");
unTransfer(num, b, last);
printf("\n");
system("pause");
return 0;
}
任何一个正整数都可以用2的幂次方表示。
算法思路
算法的思想与题目1一模一样,把2的次方,看作是当前二进制位数为1时的位置与2的次方即可,只需要把show()方法改成能输出()和+即可。
void show(int i, int *list){
for (int j = i; j >= 0; j--){
if (list[j] == 1){
printf("2");
printf("(%d)", j);
if (j != 0){
printf("+");
}
}
}
}
/*
这里show的方式相对灵活一点
用for循环,找到(二进制)数组中为1时,输出2(%d)当前位置即可,
唯独判断在数组最后去掉“+”。
*/
完整代码
#include<stdio.h>
#include<Windows.h>
#pragma warning(disable : 4996);
void show(int i, int *list){
for (int j = i; j >= 0; j--){
if (list[j] == 1){
printf("2");
printf("(%d)", j);
if (j != 0){
printf("+");
}
}
}
}
int unTransfer(int num, int *list){
int i = 0;
for (; num > 0;){
list[i] = num % 2;
num /= 2;
i++;
}
return i;
}
void Transfer(int num /*要转换数*/, int list[]/*字符串*/, int i/**/){
if (num == 0){
show(i,list );
}
else{
list[i] = num % 2;
num /= 2;
i++;
Transfer(num, list,i);
}
}
int main(){
int num;
int arr[32];
printf(" Input Format \n");
scanf("%d", &num);
printf(" Output Format \n");
int i = 0;
//int i = Transfer(num, arr);
//show(i, arr);
Transfer(num, arr, i);
system("pause");
return 0;
}