文章

2

粉丝

164

获赞

0

访问

1.6k

头像
1284整除问题
我要提问
发布于2023年5月23日 23:17
阅读数 751

我构造了两个数组,分别用来存储对应下标的素数个数,我的存储数组的内容是没有错的,但是我最后的结果总是不对,有没有佬能解决一下的

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000000 + 5;
int prime[maxn];

void getPrime() {
    memset(prime, 0, sizeof(prime));
    for (int i = 2; i <= maxn; i++) {
        if (!prime[i])
            prime[++prime[0]] = i;
        for (int j = 1 ; j <= prime[0] && prime[j]*i <= maxn; j++) {
            prime[prime[j] * i] = 1;
            if (i % prime[j] == 0)
                break;
        }
    }
}

int jc(int a) {
    if (a == 0)
        return 1;
    else {...

登录查看完整内容


登录后发布评论

14 条评论
admin SVIP
2023年5月24日 13:24

从你发的代码中没有实现你说的这个思路

我的这个思路是对n!的每一项,即1,2,3.....n,求其的质因子个数,应该不需要求阶乘吧,我只要将每一项的质因子个数进行统计,再相加,就是n!的质因子个数吧,感觉不需要再求阶乘了

赞(0)

成功2023 : 回复 admin: 我好像不小心把n--删掉了,把n--写到if的下一条语句中,并且还在while循环中,但是加上n--依然是不对的,下面我就加上n--说明下我的思路。我输入n以后,例如n=6,然后用6去试prime数组中的每一个质数,将6分解为一个个质因子,运行完后,运行n--,将n变为5进行相同的操作,直至n=1退出while循环,是这么一个过程。 老师您看看加上n--后依然是不对的,您抽空再指导指导我吧

2023年5月24日 16:26

admin : 回复 成功2023: 如果是加上n--的话,你需要用个临时变量来代替n进行分解,因为你里面有一条语句n/=prime[i-1],当输入6的时候直接分解之后n就为1了,所以根本不会有n=5、n=4......这些情况出现

2023年5月24日 16:34

成功2023 : 回复 admin: 噢噢噢噢,对对对,迷了迷了

2023年5月24日 20:11
admin SVIP
2023年5月24日 01:09

还有一个细节问题你没考虑到

1000的阶乘会爆int和long long所以不能直接算阶乘值

在计算的过程中就要分解素因数

赞(1)

成功2023 : 回复 admin: 是的

2023年5月24日 11:03

成功2023 : 回复 admin: 老师您看我下面的代码,为什么数组中保存的是我输入的n的质因子,而不是n!的质因子呢?比如我n输入6,出来的二进制是11000(2*3),本来应该是42010(2^4 * 3^2 * 5^1) while (n >= 2) { for (int i = 2; i <= prime[0]; i++) { while (n % prime[i - 1] == 0) { arrayn[prime[i - 1]]++; n /= prime[i - 1]; } } if (n > 1) arrayn[n]++; n--; }

2023年5月24日 12:09

admin : 回复 成功2023: 这里没有对n求阶乘,在while(n>=2)外面应该再套一层循环求阶乘for(int k = 2; k < n; k++)然后用k替换你代码里的n

2023年5月24日 12:30

成功2023 : 回复 admin: 我的这个思路是对n!的每一项,即1,2,3.....n,求其的质因子个数,应该不需要求阶乘吧,我只要将每一项的质因子个数进行统计,再相加,就是n!的质因子个数吧,感觉不需要再求阶乘了

2023年5月24日 12:58

admin : 回复 成功2023: 嗯,思路是没问题的,你把完整代码发一下,估计是细节上的问题。

2023年5月24日 13:06

成功2023 : 回复 admin: 以下是我的代码,真是麻烦您了老师 #include <bits/stdc++.h> using namespace std; const int maxn = 1000000 + 5; int prime[maxn]; void getPrime() { memset(prime, 0, sizeof(prime)); for (int i = 2; i <= maxn; i++) { if (!prime[i]) prime[++prime[0]] = i; for (int j = 1 ; j <= prime[0] && prime[j]*i <= maxn; j++) { prime[prime[j] * i] = 1; if (i % prime[j] == 0) break; } } } int main() { getPrime(); int n, a, k; while (cin >> n >> a) { int atest = a; int arrayn[1000] = {0}, arraya[1000] = {0}; while (n >= 2) { for (int i = 2; i <= prime[0]; i++) { while (n % prime[i - 1] == 0) { arrayn[prime[i - 1]]++; n /= prime[i - 1]; } } if (n > 1) arrayn[n]++; } for (int i = 2; i <= prime[0]; i++) { while (a % prime[i - 1] == 0) { arraya[prime[i - 1]]++; a /= prime[i - 1]; } } if (a > 1) arraya[a]++; int m = 1000; for (int j = 2; j <= atest; j++) { if (arraya[j]) { m = min(m, arrayn[j] / arraya[j]); } } cout << m << endl; //以下部分是看两个数组中的内容,从下标为2开始,如果i是素数,则数组对应的内容为1 // for (int i = 2; i <= 10; i++) { // cout << arrayn[i] << " "; // } // cout << endl; // for (int i = 2; i <= 10; i++) { // cout << arraya[i] << " "; // } // cout << endl; } return 0; }

2023年5月24日 13:08

admin : 回复 成功2023: 我新开一个回复发截图哈

2023年5月24日 13:22
admin SVIP
2023年5月24日 01:08

你的a中途参与运算了,导致最后的for循环a变成了1,可以用个临时变量存一下a的值。

赞(1)

成功2023 : 回复 admin: 对的对的,睡醒了刚刚又看了一遍发现了哈哈哈,谢谢谢谢

2023年5月24日 11:02