C语言中的问题int-long。代码可以很好地处理int,但不会很长。为什么?

C语言中的问题int-long。代码可以很好地处理int,但不会很长。为什么?,c,C,当我使用int时,我的代码会产生正确的结果。但是当我在代码中使用长值时,代码不会停止,我需要Ctrl-C来停止它。函数是div和是prime可以与long配合使用。问题出在prime\u divs中。我将inti(在循环中)修改为long I,但仍然没有任何内容 #include <stdio.h> long is_div(long number, long i) { // Vérifie si i est un diviseur de number return

当我使用int时,我的代码会产生正确的结果。但是当我在代码中使用长值时,代码不会停止,我需要Ctrl-C来停止它。函数
是div
是prime
可以与
long
配合使用。问题出在
prime\u divs
中。我将
inti
(在循环中)修改为
long I
,但仍然没有任何内容

#include <stdio.h>

long is_div(long number, long i)
{
    // Vérifie si i est un diviseur de number
    return number % i == 0;
}

long is_prime(long number)
{
    // Vérifie si number est un nombre premier
    for (int i = 2; i < number; i++)
        if (is_div(number, i)) return 0;
    return 1;
}

long* prime_divs(long number)
{
    // Calcule la liste des diviseurs premiers de number
    long index = 0;
    static long prime_dividers[100];

    for (long i = 2; i < number; i++){
        if (is_prime(i) && is_div(number, i)){
            prime_dividers[index++] = i;
        }
    }
    return prime_dividers;
}

int main(void)
{
    long *res = prime_divs(1021406);
    for (long i = 0; i < 5; i++) printf("%li", res[i]);
}
#包括
long is_div(long number,long i)
{
//Vérifie是数字除数
返回编号%i==0;
}
长是素(长数)
{
//Vérifie si number是一个不知名的总理
for(int i=2;i
因为您使用的数字太大,所以代码需要很长时间才能工作。如果你等待,你会发现它最终会给出一个结果


此外,如评论中所述,
100
元素的
prime\u divider
是不够的。你需要更多,但我不知道有多少。我会谨慎行事,选择
10000

使用的算法非常慢,因为基本测试最多需要
n
测试。OP只是等待的时间不够长

避免以下情况,因为它可能会在
number
附近的
LONG\u MAX
溢出

for (int i = 3; i*i <= number; i += 2) {  // Overflow possible - UB

for(int i=3;i*我很遗憾,我已经尝试过了,但没有效果。我只是再次尝试以确定它是否有效,但没有。即使使用长i.@Gwynbleidd也可以在
is_prime
中尝试。我尝试过,只是忘了在我的代码中编辑它。确定编辑:当我给出int时代码有效。这里:long*res=prime_divs(1021)。代码使用此数字。@gwynbled您的代码确实有效,但运行时间很长。请不要在有人发布答案后编辑代码以包含建议。例如,如果我建议在代码中使用
long
而不是
int
,请不要编辑问题以将
int
更改为
long
。你确定
prime\u dividers
的100个元素足以覆盖到1021406吗?我想
prime\u dividers[index++]
会超过索引100。当问题解决时,请不要在问题中添加“已解决”。只需接受答案。实际上,你的程序会因为i486所说的内容以及你编程的方式而崩溃“搜寻素数”的初始值为1021406,偶数乘以自身溢出。相比之下,
0xffffffffff
UINT_MAX
(只有一个
f
更少)。@S.S.Anne True,但是
i
中对于(int i=3;i*i)不会太大
long is_prime(long number) {
  // Handle cases 3 or less.
  if (n <= 3) {
    return n >= 2;
  }

  // for (int i = 2; i < number; i++)
  // Notice this only iterates up to sqrt(number)
  for (int i = 3; i <= number/i; i += 2) {
    if (number%i == 0) return 0;
  }

  return 1;
}
for (int i = 3; i*i <= number; i += 2) {  // Overflow possible - UB