题目描述:
给定一个 k+1 位的正整数 N,写成 ak⋯a1a0的形式,其中对所有 i 有 0≤ai <10 且 ak>0。N 被称为一个回文数,当且仅当对所有 i 有 ai=ak−i。零也被定义为一个回文数。
非回文数也可以通过一系列操作变出回文数。首先将该数字逆转,再将逆转数与该数相加,如果和还不是一个回文数,就重复这个逆转再相加的操作,直到一个回文数出现。如果一个非回文数可以变出回文数,就称这个数为延迟的回文数。(定义翻译自 https://en.wikipedia.org/wiki/Palindromic_number )
给定任意一个正整数,本题要求你找到其变出的那个回文数。
输入格式:
输入在一行中给出一个不超过1000位的正整数。
输入样例:
输出格式:
对给定的整数,一行一行输出其变出回文数的过程。每行格式如下
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;
}