大数据加法
给一个数num和最大迭代数k
每次num=num+num的倒序,判断此时的num是否是回文数字,是则输出此时的数字和迭代次数
如果k次结束还没找到回文数字,输出此时的数字和k
如果num一开始是回文数字,那么直接输出num和0即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <string> using namespace std; const int maxn=205; struct Bign{ int len,num[maxn]; // 这里num[0]是最低位,num[len-1]是最高位 Bign(){ memset(num,0,sizeof(num)); len=1; } Bign(int val){ *this=val; } Bign(const char*val){ *this=val; } //以int型赋值 Bign operator=(int val){ char s[maxn]; sprintf(s,"%d",val); *this=s; //字符串赋值 return *this; } //以字符串赋值 Bign operator=(const char*val){ len=strlen(val); for(int i=0;i<len;i++){ num[i]=val[len-1-i]-'0'; } return *this; } //去掉前导0 void clean(){ while(len>1&&!num[len-1]){ len--; } } //转化为字符串 string tostr(){ string res=""; clean(); for(int i=0;i<len;i++){ res=(char)(num[i]+'0')+res; } if(res=="") return "0"; return res; } //重载+ Bign operator+(const Bign& b)const{ Bign c; c.len=0; for(int i=0,g=0;g||i<max(len,b.len);i++){ int x=g; if(i<len) x+=num[i]; if(i<b.len) x+=b.num[i]; c.num[c.len++]=x%10; g=x/10; } return c; } //取翻转后的数 Bign toReverse(){ clean(); Bign c; c.len=len; for(int i=0;i<len;i++){ c.num[i]=num[len-1-i]; } return c; } }; //判断是否是回文数字 bool isPal(Bign s){ int l=0,r=s.len-1; while(l<=r){ if(s.num[l]!=s.num[r]) return false; l++; r--; } return true; } int main() { char s[100]; int k; scanf("%s %d",s,&k); Bign bign=s; if(isPal(bign)){ printf("%s %d ",s,0); } else{ for(int i=1;i<=k;i++){ //cout<<"bign:"<<bign.tostr()<<" bign Reverse:"<<bign.toReverse().tostr()<<endl; bign=bign+bign.toReverse(); //cout<<" "<<bign.tostr()<<endl; if(isPal(bign) || i==k){ string ans=bign.tostr(); cout<<ans<<endl<<i<<endl; break; } } } return 0; }