首页 > 代码库 > 9.12练习

9.12练习

贴道练习题...杨老师好不容易想出来的总得给点面子...

题目描述:给定一个n进制数m,将m与的反序数m‘相加得到新的m[1],再将m1与的反序数m1‘相加得到新的m[2],以此类推。输出每步的算式,当m[i]是回文数时输出i,否则若i>30则输出no。(1<=n<=10,0<m<10^100)

嘴上AC还是很简单的...直接上代码好了(写着写着突然发现我连高精度加法都忘差不多了QAQ)

#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int max_size=101;int a[max_size],b[max_size],c[max_size],d[max_size],len,n,nowlen;char tmp[max_size];int fs(int a[]){for(int i=0;i<nowlen;i++){if(a[i]!=0)return i;}}bool huiwen(int a[]){    for(int i=0;i<nowlen;i++)         if(a[i]!=a[nowlen-i-1])             return false;    return true; }   bool sum(int a[],int b[]){    int i;    if(nowlen!=0)    {        for(i=0;i<nowlen;i++) printf("%d",a[i]);        printf("+");        for(i=fs(b);i<nowlen;i++) printf("%d",b[i]);        printf("=");        for(i=0;i<nowlen;i++) c[i]=a[nowlen-i-1];        for(i=0;i<nowlen;i++) d[i]=b[nowlen-i-1];    }    for(i=0;i<max_size;i++) c[i]+=d[i];    for(i=0;i<max_size;i++)         if(c[i]>=n)         {            c[i+1]+=1;            c[i]%=n;         }    i=max_size;nowlen=0;    while(c[i]==0) i--;    for(;i>=0;i--) {printf("%d",c[i]);a[nowlen]=c[i];nowlen++;}    printf("\n");    for(int i=0;i<nowlen;i++) b[i]=a[nowlen-i-1];    memset(c,0,sizeof(c));    memset(d,0,sizeof(d));     return huiwen(a);}int main(){    int cnt=0;    cin>>n>>tmp;    len=strlen(tmp);    for(int i=0;i<len;i++) a[i]=tmp[i]-‘0‘;    for(int i=0;i<len;i++) b[i]=a[len-i-1];    for(int i=0;i<len;i++) printf("%d",a[i]);    printf("+");    for(int i=0;i<len;i++) printf("%d",b[i]);    printf("=");    for(int i=0;i<len;i++) c[i]=a[len-i-1];    for(int i=0;i<len;i++) d[i]=b[len-i-1];    for(int i=0;;i++)    {        if(i>30) {printf("no");return 0;}        cnt++;        if(sum(a,b)) break;    }    printf("%d",cnt);    return 0; }

 

9.12练习