这个题目 需要 使用 大数乘法, 然后保留结果 后 k 位的反复操作来求得循环节。 我下面的代码仅仅只能通过 91% 的数据,
于是我去网上找了一个正确的来对拍 , 发现 输入 87 5 这两个数据出现了差异。
#include <cstdio> #include <cstring> using namespace std; //创建一个大的数据类型 //注意 : d[0] 开始 对应 整数的最高位 struct bign{ char d[10000]; int len; //下面定义构造函数,用来初始化! bign(int n, int k):bign(){ while(k--) { d[len++] = (n % 10 + 48); n /=10; } } bign(){ memset(d,0,sizeof(d)); len=0; } }; //高精度低乘法 : 将 一个 bign a 和 int b 相乘后 //得到的 bign的长度与a相同(也就是k位) bign multi(const bign &a,int b){ bign c; int carry=0; //表示进进位 for(int i=0; i <a.len; i++){ int temp=(a.d[i]-48) * b+carry; c.d[c.len++]=temp%10 + 48; carry=temp/10; } //超过 len(k) 的进位直接舍弃掉 return c; } int main() { int n, k, counter = 0; bool flag = true; scanf("%d%d",&n, &k); bign record(n,k); //将 n 转换 成bign, 保留 k 位即可。 bign sum = record; //n 的 1次方。 //模拟计算过程, do{ sum = multi(sum, n); ++counter; //计算循环节的长度 printf("%s\n", sum.d); printf("%s\n", record.d); if(counter >= 10000) //循环节超过10000位无循环节 break; }while(strcmp(sum.d ,record.d)); printf("%d\n",(counter == 10000 ? -1 : counter)); return 0; }
上述程序计算出来 输入 87 5 后循环节长度为 2500, 但是对拍的程序(100%正确) 结果为 -1 表示没有的循环节 ?
我用 python 计算了 87 的 2501 次方得到的最后 5 位数据位 00087 刚好和 87 相等啊 , 所以为什么 100% 正确的程序 说 没有循环节呢?
print("%d" % (87,)) val = 87 for i in range(1,2501): val *= 87 print(val % 100000)
请大家帮我看看, 感激不尽。
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复