序:
这道题刚开始想用longlong的数据,搜索了一下发现atoll可以将string转换为longlong,但是参数里面要求str.c_str()。这里写在前面提个醒。
题目概述:
给出一个10位以内的数字,和最大迭代次数,判断是否为回文数;若不是,在规定次数内,将原数字与原数字的逆序求和,再次判断,直到得出回文数或者超过最大迭代次数。
分析:
1.一开始看到10位以内,心想顶多就longlong吧,后面用longlong的atoll写法发现有几个点没通过,我才发现k可以到100,这样加起来很可能就超过longlong了,因此,我们全部采取string
2.judge判断是否为回文:只需判断i从0到len / 2 的未知是否都有 str[i] == str[len - 1 - i ]即可,不需要全部遍历,一般即可
3.reverseadd完成逆序相加的过程,采用string相加的方式,因为这个是等长的string,操作相对简单,就利用now和jinwei记录当前为和进位即可,同时注意char和int之间的转换枢纽’0’
代码如下:
//悠闲一刻
//全部都用string吧,虽然说起始只有10位,但是来回迭代还是很容易超过20位
#include<bits/stdc++.h>
using namespace std;
bool judge(string num)
{
int len = num.size();
bool flag = true;
for(int i = 0; i < len / 2; i++)
{
if(num[i] != num[len - 1 - i])
{
flag = false;
break;
}
}
return flag;
}
string reverseadd(string num)
{
string num1 = num;
reverse(num1.begin(), num1.end());
int len = num1.size();
string res;
int jinwei = 0, now;
for(int i = 0; i < len; i++)
{
now = (num[len - 1 - i] - '0' + num1[len - 1 - i] - '0' + jinwei) % 10;
jinwei = (num[len - 1 - i] - '0' + num1[len - 1 - i] - '0' + jinwei) / 10;
res += now + '0';
}
if(jinwei > 0) res += jinwei + '0';
reverse(res.begin(), res.end());
return res;
}
int main()
{
string num;
int k;
cin >> num >> k;
if(judge(num))
{
cout << num << endl;
cout << "0" << endl;
return 0;
}
for(int i = 1; i <= k; i++)
{
num = reverseadd(num);
if(judge(num))
{
cout << num << endl;
cout << i << endl;
return 0;
}
}
cout << num << endl;
cout << k << endl;
return 0;
}
总结:
看清楚位数要求,超长整形就用string模拟即可。