数字黑洞专题:(一)C语言证明西西弗斯(123)黑洞

欢迎来到数字黑洞专题!我将分类总结几种典型的黑洞问题,都比较基础,笔者尽力进行解答,水平不高,望指正!!!

123黑洞定义:任意取一个自然数,求出它所含偶数的个数、奇数的个数和这个数的位数,将这三个数按照“偶-奇-总”的顺序排列得到一个新数。对这个新数重复前面的做法,最终得到的结果必将是123.

什么是数字黑洞

首先解释一下”数字黑洞“,所谓数字黑洞,就是无论如何设定初始数值,在某种黑洞规则下,最终都会得到固定的一个数值,或者陷入一组数值的循环之中,就像宇宙中的黑洞吞噬它周围的任何物质一样

例如123黑洞:123456789,该自然数中偶数个数为4,奇数个数为5,位数为9,将统计出的这三个数值按照“偶-奇-总”的顺序排列得到新数459;459中偶数个数为1,奇数个数为2,位数为3,则新数为123.反复执行此程序,对所得新数重复前面的做法,最终结果必将都得到123.

传说科林斯国王西西弗斯因为触犯了众神而收到处罚,诸神命令他将一块巨石推上一座陡峭的山顶,无论他怎么努力,每当这块巨石快要到达山顶时就又会滚下山去,让他前功尽弃。于是他只能重新再推,永无休止。因此,人们借用这个故事,形象地将“123数字黑洞”称为“西西弗斯黑洞”。

思路分析:

本题采用递归结构设计验证(确保每个递归步骤都使数字向123收敛),首先对自然数进行定义和输入,先判断此自然数是否为123,如果是,则程序结束。
如果不是,则进一步求出偶数和奇数个数,仍然先定义偶数和奇数的初始值为0,将总个数设为自然数的长度。然后从个位开始判断,运用递归,如果被2整除则偶数,偶数值加一,否则奇数值加一,循环重复执行直到处理完所有位(也可以理解为执行次数count大于总位数),循环结束。所得新数设为“偶-奇-总”并输出,递归调用该过程,知道得到123。

代码参考:

#include<stdio.h>
int renum(int num);
int count;
int main() 
{
	int n;
	printf("请输入一个整数: ");
	scanf_s("%d", &n);
	renum(n);
	return 0;
}
int renum(int num)
{
	int numn;
	if (num == 123)
	{
		printf("最终结果为 :%d\n", num);
		return num;
	}
	else
	{
		int odd = 0, even = 0;
		int temp = num;
		while(temp>0)
		{
			int num = temp % 10;
			if (num % 2 == 0)
			{
				even++;
			}
			else {
				odd++;
			}
			temp /= 10;
		}
		numn = even * 100 + odd* 10 + odd + even;
		count++;
		printf("第%d次所得新数为:%d\n", count,numn);
		return renum(numn);		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值