syu问题 G: 回文数猜想

题目描述

一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。至今为止还不知道这个猜想是对还是错。现在请你编程序验证之。

输入

每行一个正整数。
特别说明:输入的数据保证中间结果小于2^31。

输出

对应每个输入,输出两行,一行是变换的次数,一行是变换的过程。

样例输入

27228
37649

样例输出

3
27228--->109500--->115401--->219912
2
37649--->132322--->355553

刚开始用string写的,返现RE??,找了半天,没找到错误,然后在hdu上交了一遍,发现过了,实在没办法,用数组,浪费了我大把时间QAQ(记得如果给的数字本身就是回文)

#include<bits/stdc++.h>
using namespace std;
int a[1000],p[30000];
bool juge(int x)
{
	int k=0,ans=0;
	while(x)
	{
		a[k++]=x%10;
		x/=10;
	}
	for(int i=0,j=k-1; i<j; i++,j--)
	if(a[i]!=a[j]) return false;
	return true;
}
int rever(int x)
{
	int k=0,ans=0;
	while(x)
	{
		a[k++]=x%10;
		x/=10;
	}
	for(int i=0;i<k;i++)
	{
		ans*=10;ans+=a[i];
	}
	return ans;
}
int main()
{
	int x,ans=0;
	while(cin>>x)
	{
		ans=0;
		p[ans++]=x;
		while(juge(x)==false)
		x=x+rever(x),p[ans++]=x;
		
		cout<<ans-1<<endl<<p[0];
		for(int i=1;i<ans;i++)
		cout<<"--->"<<p[i];
		cout<<endl;
	}
	return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述: 一个正整数,如果从称之为序数)和从称之为倒序)是一样的,这样的就叫回文。输入两个整m和n(m<n),输出区间 [m,n] 之间的回文。 回答: 题目是让我们找出一个范围内的回文,先要弄清楚什么是回文:指着念和倒着念都是相同的,如121,585等。这里要找的范围内回文,可以枚举每一个,判断是否是回文,如果是,输出。 ### 回答2: 回文是指从右读和从左读都一样的字,例如121和1221都是回文。要求输入两个整m和n(m<n),输出区间[m,n]之间的回文。 首先,我们需要判断一个是否是回文。我们可以将该转换为字符串,然后比较字符串的序和倒序是否一致即可。例如: ``` int isPalindrome(int num){ //将字转换为字符串 char str[20]; sprintf(str, "%d", num); int len = strlen(str); //比较序和倒序 for(int i=0; i<len/2; i++){ if(str[i] != str[len-i-1]) return 0; //不是回文 } return 1; //是回文 } ``` 然后,我们需要遍历区间[m,n],判断每个字是否是回文。代码如下: ``` void findPalindrome(int m, int n){ for(int i=m; i<=n; i++){ if(isPalindrome(i)) printf("%d ", i); } } ``` 完整代码如下: ``` #include <stdio.h> #include <string.h> int isPalindrome(int num){ //将字转换为字符串 char str[20]; sprintf(str, "%d", num); int len = strlen(str); //比较序和倒序 for(int i=0; i<len/2; i++){ if(str[i] != str[len-i-1]) return 0; //不是回文 } return 1; //是回文 } void findPalindrome(int m, int n){ for(int i=m; i<=n; i++){ if(isPalindrome(i)) printf("%d ", i); } } int main(){ int m, n; scanf("%d %d", &m, &n); findPalindrome(m, n); return 0; } ``` ### 回答3: 回文是从右读和从左读结果相同的正整数。为了输出区间[m, n]之间的回文,我们可以考虑从m开始逐个枚举到n,判断每个是否为回文。 首先,我们需要判断一个是否为回文。可以将该转换为字符串,然后将字符串倒序后与原来的字符串比较,如果两个字符串相同则该为回文。 代码如下: def is_palindrome(number): s = str(number) return s == s[::-1] 接下来,我们可以从m开始逐个枚举到n,判断每个是否为回文。如果是回文,则输出它。 代码如下: m = int(input("请输入m:")) n = int(input("请输入n:")) for i in range(m, n+1): if is_palindrome(i): print(i) 这样,就可以输出区间[m, n]之间的所有回文了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值