1079 延迟的回文数 (20 分)

该博客讨论了如何通过编程实现将非回文数转化为回文数的过程,主要涉及字符串操作和数学计算。作者首先介绍了回文数的定义,然后提出了一种通过反转数字并相加的方法来寻找延迟回文数。文章提供了两段C++代码,第一段代码使用字符串转换为数字再进行计算,第二段代码直接对字符串进行加法运算,减少了转换的复杂性。然而,代码在某些情况下未能正确处理结果,导致测试失败。博客最后给出了10次迭代未得到回文数的输出提示。
摘要由CSDN通过智能技术生成

题目描述:

给定一个 k+1 位的正整数 N,写成 ak⋯a1a0的形式,其中对所有 i 有 0≤ai <10 且 ak>0。N 被称为一个回文数,当且仅当对所有 i 有 ai=ak−i。零也被定义为一个回文数。
非回文数也可以通过一系列操作变出回文数。首先将该数字逆转,再将逆转数与该数相加,如果和还不是一个回文数,就重复这个逆转再相加的操作,直到一个回文数出现。如果一个非回文数可以变出回文数,就称这个数为延迟的回文数。(定义翻译自 https://en.wikipedia.org/wiki/Palindromic_number )

给定任意一个正整数,本题要求你找到其变出的那个回文数。

输入格式:

输入在一行中给出一个不超过1000位的正整数。

 输入样例:

4b.png)

输出格式:

对给定的整数,一行一行输出其变出回文数的过程。每行格式如下

A + B = C

其中 A 是原始的数字,B 是 A 的逆转数,C 是它们的和。A 从输入的整数开始。重复操作直到 C 在 10 步以内变成回文数,这时在一行中输出 C is a palindromic number.;或者如果 10 步都没能得到回文数,最后就在一行中输出 Not found in 10 iterations.。

 输出样例:

在这里插入图片描述

首先我自己的思路是:输入的是字符串,然后编写一个函数判断是否是回文数,再分别编写两个函数将字符串转数字和将数字转换成字符串。进行十次循环,如果在循环时发现有回文则输出并返回,正常结束循环则表示10次迭代没有回文数。

代码如下:

#include<iostream>
#include<string>
#include<algorithm> 
using namespace std;
int res;
string s;
bool ishuiwen(string str){
	string s1 = str;
	reverse(s1.begin(), s1.end());
	return s1 == str;
}
int getNum(string str){
	res = 0;
	for(int i = 0; i < str.length(); i++){
		res = 10*res + (str[i]-'0');
	}
	return res; 
}
string getStr(int num){
	s = "";
	do{
		s += char(num%10 + '0');
        num /= 10;
	}while(num != 0);
	reverse(s.begin(), s.end());
	return s;
} 
int main(){
	string str;
	cin>>str;
	if(ishuiwen(str)){
		cout<<str<<" is a palindromic number.";
		return 0;
	}
	int A, B, C;
	for(int i = 0; i < 10; i++){
		A = getNum(str);
        cout<<str<<" + ";
		reverse(str.begin(), str.end());
        cout<<str<<" = ";
		B = getNum(str);
		C = A + B;
		cout<<C<<endl;
		str = getStr(C);
		if(ishuiwen(str)){
			cout<<str<<" is a palindromic number.";
			return 0; 
		}
	}
	cout<<"Not found in 10 iterations.";
    return 0;
} 


代码最后一个点没过,也不知道是什么原因(可能是字符串格式问题,因为字符串转数字后,数字高位不会以0开头,但我考虑后那个点还是错的,也许没考虑到位)。

按照字符串转数字再计算很麻烦,可以让字符串与字符串直接进行加法运算,代码如下:

#include<iostream>
#include<string>
#include<algorithm> 
using namespace std;
int res;
string s;
bool ishuiwen(string str){
	string s1 = str;
	reverse(str.begin(), str.end());
	return s1 == str;
}
string add(string str){
	string str1 = str, res = "";
	reverse(str1.begin(), str1.end());
	int len = str.length();
	int carry = 0;
	for(int i = len-1; i >= 0; i--){
		int num = (str[i] - '0' + str1[i] - '0') + carry;
		carry = 0;
		if(num >= 10){
			carry = 1;
			num -= 10;
		}
		res += (num + '0');
	}
	if(carry != 0)	res += '1';
	reverse(res.begin(), res.end());
	return res; 
}
int main(){
	string str, s, res;
	cin>>str;
	if(ishuiwen(str)){
		cout<<str<<" is a palindromic number.";
		return 0;
	}
	for(int i = 0; i < 10; i++){
		s = str;
		reverse(s.begin(), s.end());
		res = add(str);
		cout<<str<<" + "<<s<<" = "<<res<<endl;
		if(ishuiwen(res)){
			cout<<res<<" is a palindromic number.";
			return 0; 
		}
		str = res;
	}
	cout<<"Not found in 10 iterations.";
    return 0;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值