首页 > 代码库 > 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练习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。