MusaGeek


私信TA

用户名:MusaGeek

访问量:1105

签 名:

MusaGeek

等  级
排  名 9231
经  验 1109
参赛次数 11
文章发表 2
年  龄 21
在职情况 学生
学  校 黄冈中学附属师院
专  业 码农

  自我简介:

废柴

TA的其他文章

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

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

兄弟们, 难道没人回答一下么
2018-12-25 22:28:44
  • «
  • 1
  • »