对任意一个自然数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
方案:
- 涉及到整数分解的操作,我认为最保险的就是先去取整数的位数,然后进行分解。用整数的位数作为分解循环的条件。
- 求和之后,还要比较一下,所以写一个求和函数会比较好,方便。
答案
#include<stdio.h>
#include<math.h>
int getdigits( int N ) ;
int getsum( int N ) ;
int main(void){
int N ;scanf("%d",&N) ;
int sum ;
int i = 1 ;
sum = getsum( N ) * 3 + 1 ;
if( sum == N ){
goto OUT ;//不喜欢用goto,这里也可以改成输出,然后return 0 ;
}
while( sum != N ){
printf("%d:%d\n",i,sum) ;
N = sum ;
sum = getsum( N ) * 3 + 1 ;
i++ ;
}
OUT:
printf("%d:%d",i,sum) ;
return 0 ;
}
int getdigits( int N )
{
N = abs(N) ;
int i = 1;//用来数位数,默认为1
for( ; N > 9 ; i++){
N = N / 10 ;
}
return i ;
}
//求整数的各位数之和
int getsum( int N )
{
N = abs(N) ;
int i = getdigits( N ) ;//获取整数的位数
int sum = 0 ;
for( ; i > 0 ; i--){
sum = sum + N % 10 ;
N = N / 10 ;
}
return sum ;
}