这个题目 需要 使用 大数乘法, 然后保留结果 后 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 人评分
WU-输出九九乘法表 (C++代码)浏览:1654 |
WU-判定字符位置 (C++代码)浏览:1395 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:567 |
母牛的故事 (C语言代码)浏览:549 |
关于C语言变量位置的问题浏览:272 |
1012题解浏览:861 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:1151 |
局部变量作函数返回值的问题浏览:963 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:509 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:549 |