这个题目 需要 使用 大数乘法, 然后保留结果 后 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)


请大家帮我看看, 感激不尽。

点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

MusaGeek 6年前 回复TA
兄弟们, 难道没人回答一下么