题目:
对任意一个自然数 N 0 N_0 N0,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数 N 1 N_1 N1;然后对 N 1 N_1 N1重复这种操作,可以产生新自然数 N 2 N_2 N2;……多次重复这种操作,运算结果最终会得到一个固定不变的数 N k N_k Nk,就像掉入一个数字“陷阱”。本题要求对输入的自然数,给出其掉入“陷阱”的过程。
输入格式:
在一行内给出一个自然数 N 0 N_0 N0( N 0 N_0 N0<30000)。
输出格式:
对于输入的
N
0
N_0
N0,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为:
i
:
N
i
i:N_i
i:Ni (
i
≥
1
i≥1
i≥1)。当某一步得到的自然数结果
N
k
N_k
Nk(
k
≥
1
k≥1
k≥1)与上一步
N
k
−
1
N_{k−1}
Nk−1相同时,停止输出。
输入样例:
5
输出样例:
1:16
2:22
3:13
4:13
程序示例:
#include<stdio.h>
int fn(int N)//分解函数
{
int sum = 0;
while(N>0)
{
sum = sum+N%10;
N/=10;
}
return sum;
}
int main()
{
int next,last,i = 0,count = 0,N;
scanf("%d",&N);
last = fn(N);
if((last*3+1)==N)
{
printf("1:%d",last*3+1);
/*特别注意,数字陷阱是13,当输入数字是13时,考虑第一次分解
并计算得出结果13,与输入的数字13相同,直接输出结果*/
}
else
{
int temp = last;
while(count<1)//当记录器记录到当前新产生的数ne和原来的数ol相等,记录次数,出现一次说明N(k-1)与Nk相等,跳出循环
{
next = temp*3+1;
if(next!=last)
{
temp = fn(next);
last = next;
i++;//i用来记录当前是第几次计算
printf("%d:%d\n",i,next);
}
else
{
i++;
printf("%d:%d",i,next);
count++;
}
}
}
return 0;
}
算法还有不完善的地方,欢迎各位批评指正!转载请注明出处,谢谢!