哈比 发表于 2019-1-5 17:14:08

求大神指点

求大神指点!
请编写函数fun,功能是:将大于形参m且紧靠m的k个素数存入xx所指的数组中。
例如,若输入17,5,则应输出:19,23,29,31,37.
以下是我打的代码:
void fun(int m, int k, int xx[])
{        int i,j,n=0,count=0;
        for(i=18;;i++)
        {        for(j=2;j<i;j++)
                {        if(i%j==0)break;
                        xx=i;
                        count++;
                        n++;
                }
                if(count>k)break;               
        }
       
}
输入17,5输出5个19

jackz007 发表于 2019-1-5 19:06:12

本帖最后由 jackz007 于 2019-1-7 16:55 编辑

    你判断素数的逻辑出了问题,看看你的代码:

for(j = 2 ; j < i ; j++) {
    if(i % j == 0) break ;
    xx = i ;
    count ++;
    n ++      ;
}

      当 i = 19 的时候,j = 2 , 3 , 4... 18 统统都不能被整除,而每次不能被整除都会判定 i 为素数而被记录一次,于是,函数执行过后,xx[]中不止有 5 个 19,而是 17 个。

      显然,是否素数只有在除完所有可能因子的时候才能最终做出判断,而不能只根据是否能被某一个数整除就下结论。

      你的代码略作修改谨供参考,fun() 函数的功能保持不变,不同的是,这个程序可以打印出质*数*表中的前200个元素。当然,在 main() 函数中,只要让 m = 17,k = 5,就可以得到完全符合题目要求的结果。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void fun(const int m , const int k , int xx[])
{
    int d , i , j , n = 0       ;
    bool f                      ;
    i = m                     ;
    while (n < k) {
      i ++                  ;
      if (i > 1) {
            f = true            ;
            d = sqrt(i) + 1   ;
            for(j = 2 ; j < d ; j ++) {
                if (! (i % j)) {
                  f = false   ;
                  break       ;
                }
            }
            if (f) xx = i ;
      }
    }
}

int main(void)
{
    int i , k , m , xx                         ;
    char s                                 ;
    m = 1                                             ;
    k = 200                                           ;
    if (m > 0 && k > 0) {
      fun(m , k , xx)                               ;
      s = 0x00                                 ;
      for(i = 0 ; i < k ; i ++) {
            if (! (i % 5)) {
                if (i) strcat(s , "\n")               ;
            } else {
                strcat(s , " , ")                     ;
            }
            sprintf(& s , "%8d" , xx)   ;
      }
      strcat(s , "\n")                              ;
      printf("\n\n")                              ;
      printf("%s\n" , s)                            ;
      printf("\n\n")                              ;
    }
}
页: [1]
查看完整版本: 求大神指点