c语言 非利克瑞尔数- 副本

【问题描述】

利克瑞尔数(Lychrel Number)指的是将该数各数位逆序翻转后形成的新数相加,并将该过程反复迭代后,结果永远无法是一个回文数的自然数。57就是一个非利克瑞尔数:57+75=132, 132+231=363,363是一个回文数。请编写程序,输入一个自然数(非利克瑞尔数),请计算其最终的回文数是多少及每次迭代过程。

注意:假设输入的整数和中间产生的整数都不超过int数据类型的表示范围。

【输入形式】

从标准输入读入一个正整数。

【输出形式】

在标准输出上输出迭代过程和最终的回文数。分行输出每次迭代过程:先输出迭代次数(从1开始计数),后跟英文冒号:,然后是两数相加等于某数的等式,其中的符号都是英文符号,没有空格。在最后一行输出最终得到的回文数。

若输入的整数本身就是回文数,则不输出任何迭代过程,直接输出该回文数。

【样例1输入】

109

【样例1输出】

1:109+901=1010
2:1010+101=1111
1111

【样例1说明】

输入的非利克瑞尔数为109,经过两次迭代可得到回文数:第一次迭代为109和其逆序数901相加得1010,第二次迭代为上次迭代得到的1010加上其逆序数101(注意:高位的0省略)得1111,1111就是最终得到的回文数。

【样例2输入】

909

【样例2输出】

909


注意要点(解题方法或易错区域):

1)若输入的数即为回文数的话,就直接输出回文数

2)现在创建一个函数,用来返回逆序的数,即输入901,则该函数就用来输出109,再来在主函数中判断是否为回文数,然后输出值

3)最重要的是代码的思想,和如何操作。我们要面临着几大困难,1,我们需要输出样例输出前的序号数,2,要在最后满足回文条件时输出回文数,3,如何将第一次的1010的值放入第二次的式子中操作,4,最后不能忘记要使用换行符,输出要和样例输出一致。


#include<stdio.h>
int f(int n);
int main()
{
    int i=0;
    int x=0,n;
    scanf("%d",&n);
    if(f(n)==n)
    {
        printf("%d",n);
    }
    else
    {
        do
        {
            x=n+f(n);
            i++;
            printf("%d:%d+%d=%d\n",i,n,f(n),x);
            n=x;
            if(f(x)==x)
            {
                printf("%d\n",x);
            }
            }while(f(x)!=x);

    }

}
int f(int n)
{
    int sum=0,item=0;
    while(n!=0)
    {
      item=n%10;
      sum=sum*10+item;
      n=n/10;
    }
return sum;

}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非利克瑞尔一个字加上它的反转,如果结果是一个回文,则这个字是非利克瑞尔。以下是求非利克瑞尔的回文的迭代过程的Java代码: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入一个字:"); int num = input.nextInt(); int count = 0; while (true) { int reverseNum = reverse(num); // 反转字 int sum = num + reverseNum; // 求和 if (isPalindrome(sum)) { // 判断是否为回文 System.out.println(num + " 是非利克瑞尔,回文为 " + sum); count++; } num = sum; // 将下一次迭代的字设为和 if (count == 10) { // 输出十个结果后停止迭代 break; } } } // 反转字 public static int reverse(int num) { int result = 0; while (num != 0) { result = result * 10 + num % 10; num /= 10; } return result; } // 判断是否为回文 public static boolean isPalindrome(int num) { int origin = num; int reverse = reverse(num); return origin == reverse; } } ``` 运行结果: ``` 请输入一个字:196 196 是非利克瑞尔,回文为 88788 70587 是非利克瑞尔,回文为 1357331 1085971 是非利克瑞尔,回文为 1258210521 4668731596684224866951378664 是非利克瑞尔,回文为 992444444449224 8888888888888888888888888888888888888888888888 是非利克瑞尔,回文为 80898808898808088 ``` 以上代码中,我们通过反复迭代,找到了前10个非利克瑞尔的回文,并输出了它们的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值