(C语言) 掉入陷阱的数字

这篇博客探讨了一个有趣的数学现象,称为数字陷阱。给定一个不超过30000的自然数N0,通过不断将它的各位数字相加求和,然后将和乘以3再加1,会进入一个数字循环。博主分享了如何编程实现这个过程,并展示了如何通过简化算法来优化代码。在示例中,数字5经过几次迭代最终稳定在13的循环中。
摘要由CSDN通过智能技术生成

对任意一个自然数N0​,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N1​;然后对N1​重复这种操作,可以产生新自然数N2​;……多次重复这种操作,运算结果最终会得到一个固定不变的数Nk​,就像掉入一个数字“陷阱”。

本题要求对输入的自然数,给出其掉入“陷阱”的过程。

输入格式:

在一行内给出一个自然数N0​(N0​<30000)。

输出格式:

对于输入的N0​,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:Ni​ (i≥1)。当某一步得到的自然数结果Nk​(k≥1)与上一步Nk−1​相同时,停止输出。

输入样例:

5

结尾无空行

输出样例:

1:16
2:22
3:13
4:13

结尾无空行

解答:

运用了之前的算几位数和把每一位数分开并相加,不过这一堆要放在一个判断Nk和Nk-1的循环中。我解题方法笨拙,要学习的还很多。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main()
{
	int a,t=0,count=0,e=1;
	scanf("%d", &a);
	int n = 0;
	 
	while (e != n) //前一个n和后一个n比较大小
    {
		int c = a, cnt=0, mask;
        //计算位数
		do {
			c /= 10;
			cnt++;
		} while (c != 0);
		mask = pow(10, cnt-1);
        //将数字分开并相加
		while (mask != 0)
		{
			int b = a / mask;
			a = a % mask;
			mask /= 10;
			t += b;
		}
		e = n;//记录前一个n的值
		n = t * 3 + 1;
		a = n;
		t = 0;
		count++;//计算第几个数,即k
		printf("%d:%d\n", count,n);
	}
	

	return 0;
}

此解题方法笨拙。

本来想试一下函数的,但我还没系统的学习函数,等学会了再说。

PTA提交时,测试点2:一步到位 结果显示答案错误。不明白什么意思。

改进:

上网查了一下,好像我想复杂了。根本不用计算位数,让a一直除以10,直到为a为0循环就可以停止了。代码就不写出来了,又不是我自己想的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值