按照凡神的模板写的,写吐了,一百多行,还有几个测试点没通过。又看了一下柳神的,39行搞定。。。看来还是不能生搬硬套,要学会变通。好不容易写的100多行,虽然有错,但还是记下来吧,毕竟花了好久,呜呜呜。如果有好兄弟可以指出来哪里错了就更好了。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct bign{
int d[1005];
int len;
bign(){
memset(d, 0, sizeof(d));
len = 0;
}
};
bign change(char str[])
{//字符串转大整数
bign a;
a.len = strlen(str);
for(int i=0; i<a.len; i++){
a.d[i] = str[a.len-i-1]-'0';
}
return a;
}
bign add(bign a, bign b)
{//大整数加法
bign c;
int carry = 0;
for(int i=0; i<a.len||i<b.len; i++){
int tmp = a.d[i]+b.d[i]+carry;
c.d[c.len++] = tmp%10;
carry = tmp/10;
}
if(carry != 0){
c.d[c.len++] = carry;
}
return c;
}
bign rever(bign a)
{//倒置大整数
bign b;
b.len = a.len;
for(int i=0; i<a.len; i++){
b.d[i] = a.d[a.len-i-1];
}
return b;
}
bool isReverse(bign a)
{//大整数是否是回文数
for(int i=0; i<a.len; i++){
if(a.d[i] != a.d[a.len-i-1]){
return false;
}
}
return true;
}
void print(bign a)
{//打印大整数
for(int i=a.len-1; i>=0; i--){
printf("%d", a.d[i]);
}
}
int main()
{
char str[1005];
scanf("%s", str);
bign a = change(str);
bign b = rever(a);
bign c = add(a, b);
int cnt = 0;
while(cnt<10 && !isReverse(c)){
print(a);
printf(" + ");
print(b);
printf(" = ");
print(c);
printf("\n");
a = c;
b = rever(a);
c = add(a, b);
cnt++;
}
if(cnt < 10){
print(a);
printf(" + ");
print(b);
printf(" = ");
print(c);
printf("\n");
a = c;
b = rever(a);
c = add(a, b);
print(a);
cout <<" is a palindromic number.";
}else{
cout << "Not found in 10 iterations.";
}
return 0;
}
PS:参考了柳神的代码之后的代码,在大整数加法那块修改一下柳神的代码,按照凡神的逻辑更好理解一点;
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(string a)
{
string b = a, ans;
reverse(b.begin(), b.end());
int len = a.length(), carry = 0;
for(int i=len-1; i>=0; i--){
int tmp = a[i]-'0' + b[i]-'0'+carry;
ans += tmp%10 + '0';
carry = tmp/10;
}
if(carry!=0){
ans += carry+'0';
}
reverse(ans.begin(), ans.end());
return ans;
}
int main()
{
string a;
cin >> a;
string c = add(a);
int cnt = 0;
while(cnt<10){
string b = a;
reverse(b.begin(), b.end());
if(a==b){
cout << a<<" is a palindromic number."<<endl;
break;
}else{
cout<< a <<" + "<< b <<" = "<<add(a)<<endl;
a = add(a);
cnt++;
}
}
if(cnt==10){
cout<<"Not found in 10 iterations."<<endl;
}
return 0;
}