| 
 | 
 
 
发表于 2020-5-27 20:42:55
|
显示全部楼层
   本楼为最佳答案    
 
 
  这题要模拟高精度加法,先把输入的数字按位正序和逆序存放在两个数组里,然后写一个模拟列竖式的加法函数和一个判断回文的函数,循环下去就行 
- #include <iostream>
 
 - #include <cstring>
 
 - using namespace std;
 
 - int toInt(char s[], int a[], int b[])
 
 - {
 
 -         char *p = s;
 
 -         char *q = s;
 
 -         int i=0;
 
 -         int len;
 
 -         while(*p)
 
 -         {
 
 -                 if(*p>='0'&&*p<='9')
 
 -                 a[i] = *p-'0';
 
 -                 else
 
 -                 a[i] = *p - 'A'+10;
 
 -                 i++;
 
 -                 p++;
 
 -         }
 
 -         len = i;
 
 -         i--;
 
 -         while(*q)
 
 -         {
 
 -                 if(*q>='0'&&*q<='9')
 
 -                 b[i] = *q-'0';
 
 -                 else
 
 -                 b[i] = *q-'A'+10;
 
 -                 i--;
 
 -                 q++;
 
 -         }
 
 -         return len;
 
 - }
 
 - int add(int n, int len, int a[], int b[])
 
 - {
 
 -         int i,temp;
 
 -         for( i=0; i<len; i++)
 
 -         {
 
 -                 temp = (a[i]+b[i])/n;
 
 -                 a[i] = (a[i]+b[i])%n;
 
 -                 a[i+1]+=temp;
 
 -         }
 
 -         if(a[i]==0)
 
 -                 return len;
 
 -         else
 
 -                 return len+1;
 
 - }
 
 - bool judge(int c[], int len)
 
 - {
 
 -         for(int i=0; i<=len/2; i++)
 
 -                 if(c[i]!=c[len-i-1])
 
 -                         return false;
 
 -         return true;
 
 - }
 
 - void reverse(int lenc, int c[], int rc[])
 
 - {
 
 -         for(int i=0; i<lenc; i++)
 
 -                 rc[i] = c[lenc-i-1];
 
 - }
 
 - int main()
 
 - {
 
 -         int a[1000]={0}, b[1000]={0},ra[1000]={0};
 
 -         char s[1000];
 
 -         int n;
 
 -         int step = 1;
 
 -         cin>>n;
 
 -         cin>>s;
 
 -         int lens = toInt(s,a,b);
 
 -         int lena = add(n,lens,a,b);
 
 -         while(!judge(a,lena))
 
 -         {
 
 -                 step ++;
 
 -                 reverse(lena,a,ra);
 
 -                 lena=add(n,lena,a,ra);
 
 -                 if(step>30)
 
 -                         break;
 
 -         }
 
 -         if(step<=30)
 
 -         cout<<"STEP="<<step<<endl;
 
 -         else
 
 -         cout<<"Impossible!"<<endl;
 
 -         return 0;
 
 - }
 
  复制代码 
可能有的地方算法不够好,可以再改改  |   
 
 
 
 |