1、題目地址:http://www.patest.cn/contests/pat-a-practise/1024
2、分析
在做這答題的過程中很可能出現下面的思路:
#include "stdio.h"
long long reverse(long long n)
{
long long m = 0;
long long tmp = 10;
do{
m = m*10 + n % tmp;
n = n/tmp;
}while(n);
return m;
}
int main()
{
long long n;
int k;
scanf("%lld%d",&n,&k);
long long m;
int i = 0;
if(n == reverse(n)){
;
}else {
for(i = 1;i <= k;++i){
m = reverse(n);
n += m;
if(n == reverse(n))
break;
}
}
if(i > k)
i = k;
printf("%lld\n%d\n",n,i);
}
但提交時,會出現不能全部通過,這是因爲:原始的N最多是10^10,但在後來的翻轉過程中,N會變得很大,但小於等於(10^10)*(2^100)
3正確代碼:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(const string &s1, const string &s2)
{
int sum,carry = 0;
char digit;
string ans;
int i = s1.size() - 1 , j = s2.size() - 1;
for(;i >= 0 && j >= 0;--i,--j){
sum = s1[i] - '0' + s2[j] - '0' + carry;
digit = sum % 10 + '0';
ans.push_back(digit);
carry = sum / 10;
}
int k = i < 0 ? j : i;
const string &str = i < 0 ? s2 : s1;
while(k >= 0){
sum = str[k] + carry;
digit = sum % 10 + '0';
carry = sum / 10;
ans.push_back(digit);
}
if(carry > 0){
digit = carry + '0';
ans.push_back(digit);
}
reverse(ans.begin(),ans.end());
return ans;
}
int main()
{
string str;
int k;
cin >> str >> k;
string res = str;
reverse(res.begin(),res.end());
int i;
for(i = 0;i < k;++i){
if(str == res)
break;
str = add(str,res);
res = str;
reverse(res.begin(),res.end());
}
cout << str << endl << i << endl;
}