原题链接:循环
解题思路:
考察高精,累乘。
循环条件:原数*累乘器=原数。
此时:原数*累乘器=原数。
即乘n个累乘器,已匹配的位数不改变。
1位位地匹配,如果某一位出现11个数字,则必定没有循环。
注意每一位匹配后,累乘器要更新。
注意事项:
参考代码:
#include<cstdio> #include<cstring> int ans[101]; int a[101],n=0,k; int i,j,rec[101],newn[101]; char ch[101]; bool judge(int k) //计算是否循环 { int s[102]; memset(s,0,sizeof(s)); for (int i=1; i<=n; i++) for (int j=1; j<=newn[0]; j++) if (i+j-1 > k) break; else { s[i+j-1]+=a[i]*newn[j]; s[i+j]+=s[i+j-1]/10; s[i+j-1]%=10; } if (s[k] == a[k]) return 1; return 0; } void mul() //累乘 { int s[102]; memset(s,0,sizeof(s)); for (int i=1; i<=rec[0]; i++) for (int j=1; j<=newn[0]; j++) if (i+j-1 <= n) { s[i+j-1]+=rec[i]*newn[j]; s[i+j]+=s[i+j-1]/10; s[i+j-1]%=10; } if (rec[0]+newn[0]-1 >= n) s[0]=n; else if (s[rec[0]+newn[0]] > 0) s[0]=rec[0]+newn[0]; else s[0]=rec[0]+newn[0]-1; for (int i=0; i<=s[0]; i++) newn[i] = s[i]; } void calc(int x) //单精*高精 { for (int i=1; i<=ans[0]; i++) ans[i]*=x; for (int i=1; i<=ans[0]; i++) { ans[i+1]+=ans[i]/10; ans[i]%=10; } while (ans[ans[0]+1] > 10) { ans[0]++; ans[ans[0]+1]+=ans[ans[0]]/10; ans[ans[0]]%=10; } if (ans[ans[0]+1] > 0) ans[0]++; } int main() { scanf("%c",&ch[++n]); while (ch[n] != ' ') scanf("%c",&ch[++n]); scanf("%d",&k); n--; for (i=1; i<=n; i++) a[i]=ch[n+1-i]-'0'; if (n > k) n=k; if (n < k) { for (i=n+1; i<=k; i++) a[i] = 0; n = k; } //init for (i=1; i<=n; i++) rec[i]=a[i]; //last one 加数 rec[0]=n; for (i=1; i<=n; i++) newn[i]=a[i]; newn[0]=n; //rec^x (累乘器) ans[0]=1; ans[1]=1; for (i=1; i<=k; i++) { if (judge(i)) continue; //第i位相等 else for (j=2; j<=11; j++) { mul(); //累乘器 if (judge(i)) break; } if (j > 11) //无解 { printf("-1"); return 0; } calc(j); //ans=ans*j; for (j=newn[0]; j>=0; j--) rec[j]=newn[j]; } for (i=ans[0]; i>=1; i--) printf("%d",ans[i]); return 0; }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复