|
发表于 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;
- }
复制代码
可能有的地方算法不够好,可以再改改 |
|