C语言 打印好了,要求指出代码中的错误

pgky5nke  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(111)

把lim的所有质数放进aa数组。
此函数返回获得的素数的个数,最后打印这些素数。
这是我的代码。

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>
#define MAX 100

int func(int lim,int aa[MAX])
{
  int i,count,num;
  num = 0;
  for(count = 2;count<lim;count++)
  {
    for(i=2;i<=sqrt(count);i++)
    {
        if(count%i==0) 
          break;
    }
    if(i>sqrt(count))
        {
           aa[num]=i;
           num++;
        }   
  }
  return num;
}

int main()
{
  int limit,i,sum;
  int aa[MAX];
  printf("Please input an integer:");
  scanf("%d",&limit);
  sum=func(limit,aa);
  for(i=0;i<sum;i++)
  {
    if(i%10==0&&i!=0) 
       printf("\n");
    printf("%5d",aa[i]);
  }

  return 0;
}

不幸的是,我运行程序时得到的结果并没有达到预期。
错误是每次运行结果的第一个数字都是 * 2 *,最后一个数字丢失
例如:
应该是2 3 5.

olhwl3o2

olhwl3o21#

避免整数问题的浮点数学

不要使用sqrt()

// for(i=2;i<=sqrt(count);i++)
for(i = 2; i <= count/i; i++)

找到MAX值后不再迭代

aa[num]=i;
       num++;
       if (num == MAX) return num; //add

我建议使用isprime()辅助函数来简化代码。

int isprime(int num) {
  if (num % 2 == 0)
    return num == 2;
  for (int divisor = 3; divisor <= num / divisor; divisor += 2) {
    if (num % divisor == 0)
      return 0;
  }
  return num > 1;
}

int func(int lim, int aa[MAX]) {
  size_t prime_index = 0;
  for(int prime_candidate = 2; prime_candidate <= lim; prime_candidate++) {
    if (isprime(prime_candidate)) {
      aa[num] = prime_candidate;
      num++;
      if (num == MAX) break;
    }   
  }
  return num;
}

相关问题