PTA 翁恺 7-31 掉入陷阱的数字

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

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

输入格式:

在一行内给出一个自然数N0N0<30000)。

输出格式:

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

输入样例:

5
 
结尾无空行

输出样例:

1:16
2:22
3:13
4:13
 
结尾无空行
整体思路:
  1. 经典拆分数字,拆分完之后存在数组里加起来。
  2. 变量分析:input存储输入值,i为循环变量,sum存储各数字位的和,num为进行的次数,数组a存储各数字位,数组b存储最终结果。
  3. 循环结束判断:b[num] == b[num]-1

整体代码:

#include <stdio.h>
#include <math.h>

int main (void){
    int input = 0,wei = 0;
    int i = 0,num = 1,sum = 0;
    int a[7] = {0},b[10] = {0};
    scanf ("%d",&input);
    int sent = 0;
    sent = input;
    b[0] = input;
    if (sent == 0)
    {
        printf("1:1\n2:4\n3:13\n4:13");
        return 0;
    }
    while (1)
    {
        for (i = 0; i < 6; ++i)
        {
            if ((sent >= pow(10,i)) && (sent < pow(10,i+1)))
                wei = i + 1;
        }
        for (i = 0; i < wei; ++i)
        {
            a [i] = sent / pow(10,wei-i-1);
            sent = sent - a[i] * pow(10,wei-i-1);
            sum += a[i];
        }
        b[num] = sum * 3 + 1;
        sent = b[num];
        printf ("%d:%d\n",num,b[num]);
        if (b[num] == b[num-1])
            break;
        num++;
        sum = 0;
    }
    return 0;
}

讨论:

  • 小心那种一步到位的数,就是处理一次之后和原来的数相同,这个时候把b[0]= input,就行了
  • 还有特殊情况就是0,我采取的拆数法处理不了首位为0,有0直接return吧
posted @ 2021-10-18 22:45  海萌萌萌萌萌萌  阅读(610)  评论(0)    收藏  举报