|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目是
对任意一个自然数N
0
​
,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N
1
​
;然后对N
1
​
重复这种操作,可以产生新自然数N
2
​
;……多次重复这种操作,运算结果最终会得到一个固定不变的数N
k
​
,就像掉入一个数字“陷阱”。
本题要求对输入的自然数,给出其掉入“陷阱”的过程。
输入格式:
在一行内给出一个自然数N
0
​
(N
0
​
<30000)。
输出格式:
对于输入的N
0
​
,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:N
i
​
(i≥1)。当某一步得到的自然数结果N
k
​
(k≥1)与上一步N
k−1
​
相同时,停止输出。
- #include<stdio.h>
- int trap(int x)
- {
- int sum=0;
- while(x>0)
- {
- int a;a=x%10;sum=sum+a;x=x/10;
- sum=sum*3+1;
- }
- return sum;
- }
- int main()
- {
- int n;scanf("%d",&n);
- int i=1;
- for(;;i++)
- {
- int nn=trap(n);
- printf("%d:%d",i,nn);
- if(n==nn) break;
- n=nn;
- }
- }
复制代码
问题在于在循环内部计算了 sum=sum*3+1 ,导致每次循环 sum 的值都在变化,而不是固定不变的。应该将这一行代码移到循环外部,只在每次循环开始时计算一次。修改后的代码如下:
- #include <stdio.h>
- int trap(int x) {
- int sum = 0;
- while (x > 0) {
- int a = x % 10;
- sum = sum + a;
- x = x / 10;
- }
- return sum;
- }
- int main() {
- int n;
- scanf("%d", &n);
- int i = 1;
- int nn = trap(n);
- while (n != nn) {
- printf("%d:%d\n", i, nn);
- n = nn;
- nn = trap(n);
- i++;
- }
- printf("%d:%d\n", i, nn);
- return 0;
- }
复制代码
|
|