题目描述
链接
将数字(不超过1000位)反转求和得到的结果是否是回文数
分析
- 需要的函数,数字反转,大数求和,判断是否是回文数
- 一开始其实不需要考虑大数的问题!!这样至少能过很多样例!!!
- 这样数字可以就用纯数字long long表示!!!!(其实用nums数组最开始就保存更方便!!!)
- 数字反转:用nums数组保存每一位,每一个得到的方法就是循环取余。反转的话可以用reverse函数
- 加法的话可以按照进制转换那样求和
- 回文数:可以循环判断,也可以直接反转,看数和反转的数是否相等
- 这样过不了一个大数样例,可以写大数加法,但是记得大数的话:数字低位在数组的低位。所以需要reverse。加法完成后,还需要reverse回来。然后记得进位的情况
- 另外!!记得多位数字串的时候!!不要总想用字符串!int数组也可以考虑!!!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c;
ll reverse(ll a){
ll res = 0;
while(a){
res = res * 10 + a%10;
a /= 10;
}
return res;
}
bool ispal(ll a){
int nums[1024];
int len = 0;
while(a){
nums[len++] = a % 10;
a /= 10;
}
for(int i=0;i<len;i++){
if(nums[i] != nums[len - i - 1]) return false;
}
return true;
}
int main(){
scanf("%lld", &a);
int cnt = 0;
if(ispal(a)){
printf("%lld is a palindromic number.
", a);
return 0;
}
while(cnt<10){
b = reverse(a);
c = a + b;
printf("%lld + %lld = %lld
", a,b,c);
if(ispal(c)){
printf("%lld is a palindromic number.
", c);
return 0;
}
cnt++;
a = c;
}
printf("Not found in 10 iterations.
");
}
大数加法的话
#include<bits/stdc++.h>
using namespace std;
string s;
//以后做题观察时限首选STL
string rev(string s){ //重新写一个函数来产生反转字符串
reverse(s.begin(), s.end());
return s;
}
string add(string s1, string s2){ //重点!!!!
string s;
int carry = 0;
for(int i=0;i<s1.length() || i<s2.length(); i++){ //注意这个写法!!!
int temp = (s1[i]-'0' + s2[i]-'0' + carry);
s += temp%10 + '0';
carry = temp / 10;
}
if(carry!=0) s += (carry + '0'); //注意最后carry不等于0的情况
return s;
}
bool ispal(string s){
int len = s.length();
for(int i=0;i<len;i++){
if(s[i] != s[len-1-i]) return false;
}
return true;
}
int main(){
string s1,s2,s3;
cin>>s1;
int cnt = 0;
if(ispal(s1)){
cout<<s1<<" is a palindromic number."<<endl;
return 0;
}
while(cnt<10){
s2 = rev(s1);
s3 = rev(add(s1,s2));
cout<<s1<<" + "<<s2<<" = "<<s3<<endl;
if(ispal(s3)){
cout<<s3<<" is a palindromic number."<<endl;
return 0;
}
cnt++;
s1 = s3;
}
cout<<"Not found in 10 iterations."<<endl;
}