将非负十进制整数n转换成b进制,任何一个正整数都可以用2的幂次方表示

本文介绍了如何将非负十进制整数转换为2到16进制的方法,通过每次取模和除法实现递归转换,并阐述了任何正整数都可用2的幂次方表示的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将非负十进制整数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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值