进制转换(无负数)

359 阅读3分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

这是今天一个比较小的练习题,但是我想通过这个来试一试普遍的方法,也就是说自己写个方法,SysConvert(进制转换),两个参数,第一个就是源头数source_num,第二个就是目标进制destination_sys

源头就是自己随便写个数,目标进制就是自己想要什么样的进制,然后return 目标进制数就好了。

{
	int num = 0;
	int destination_sys = 0;
	printf("请输入想要转换的数:>");
	scanf("%d%d",&num,&destination_sys);
	printf("%d", SysConvert(num,destination_sys));
	return 0;
}

为了说的方便这里我分开代码,上面是主函数只需要实现SysConvert()功能就好。

 功能实现SysConvert(int source_num, int destination_sys)

{
	int dbuf[1000] = { 0 };//这个是存放转换后的进制数组,也就是缓存区
	int i = 0;//这个是下标变量
	int len = 1;//这个是长度标记
	int destination_sys_num = 0;//这个也就是我们需要返回的转换进制数
	dbuf[i] = source_num;//这个绝对不能忘,他就是不足转换进制数直接输出的,牛客上就没有这段代码,所以有一点bug
	while (source_num>=destination_sys)
	{
		dbuf[i] = source_num % destination_sys;//取模放在数组第一个位置
		dbuf[i+1] = source_num / destination_sys;//除以,就放在前一个位置
		source_num = source_num / destination_sys;
		i++;//下标加加
		len++;//循环结束也就是len出来了
	}
	while (len>0)//这里就是len的重要性
	{
		destination_sys_num += dbuf[len - 1] * (int)power_num(10, len - 1);//这里刚好可以运用我们写的n的k次方来操作,我是返回double类型的所以这里强转int类型
		len--;//len到0的那一刻就是转换进制数跑出来的那一刻
	}
	return destination_sys_num;
}

n的k次方实现

{
	if (power > 0)
		return num * power_num(num, power - 1);
	else if (power == 0)
		return 1.0;
	else
		return 1.0 / power_num(num, -power);
}

用递归实现会非常简单,非递归代码量会很大。

注:没有写负数的进制转换

几个测试了都正确

再来一个智力题

==题目:==有1000瓶药物,但是其中有一瓶是有毒的,小白鼠吃了一个星期以后就会死掉!请问,在一个星期内找出有毒的药物,最少需要多少只小白鼠?

这题看似很难,但是仔细找规律的话还是可以发现一些端倪的

可能1000很多,但我们从最简单的接触再延伸到1000就会感觉简单一点

一瓶 假如就是一瓶,需要多少只小鼠呢
image-20210908173138912 两瓶 假如两瓶呢
image-20210908173310275 三瓶(自想一法) 3瓶就能彩到规律了,再不济你就4次
image-20210908173410274 三瓶(序号规则) 这是验证了想法的确可行,但序号是不是有点不好看想有顺序一点00 01 10然后赋予他老鼠吃药的思想
image-20210908174107984 四瓶(验证指数) 指数2就是两只鼠 那4也是2也就意味着也是两只鼠吗,所以假如4瓶药
image-20210908174952122 九瓶(验证猜想)
image-20210908181333236 一千瓶 image-20210908182152906

赶紧睡觉不行了。。。