鱼C论坛

 找回密码
 立即注册
查看: 2892|回复: 1

求大神指点

[复制链接]
发表于 2019-1-5 17:14:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大神指点!
请编写函数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[n]=i;
                        count++;
                        n++;
                }
                if(count>k)break;               
        }
       
}
输入17,5输出5个19
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-5 19:06:12 | 显示全部楼层
本帖最后由 jackz007 于 2019-1-7 16:55 编辑

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

  1. for(j = 2 ; j < i ; j++) {
  2.     if(i % j == 0) break ;
  3.     xx[n] = i ;
  4.     count ++  ;
  5.     n ++      ;
  6. }
复制代码


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

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

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>

  5. void fun(const int m , const int k , int xx[])
  6. {
  7.     int d , i , j , n = 0       ;
  8.     bool f                      ;
  9.     i = m                       ;
  10.     while (n < k) {
  11.         i ++                    ;
  12.         if (i > 1) {
  13.             f = true            ;
  14.             d = sqrt(i) + 1     ;
  15.             for(j = 2 ; j < d ; j ++) {
  16.                 if (! (i % j)) {
  17.                     f = false   ;
  18.                     break       ;
  19.                 }
  20.             }
  21.             if (f) xx[n ++] = i ;
  22.         }
  23.     }
  24. }

  25. int main(void)
  26. {
  27.     int i , k , m , xx[0x800]                         ;
  28.     char s[0x80000]                                   ;
  29.     m = 1                                             ;
  30.     k = 200                                           ;
  31.     if (m > 0 && k > 0) {
  32.         fun(m , k , xx)                               ;
  33.         s[0] = 0x00                                   ;
  34.         for(i = 0 ; i < k ; i ++) {
  35.             if (! (i % 5)) {
  36.                 if (i) strcat(s , "\n")               ;
  37.             } else {
  38.                 strcat(s , " , ")                     ;
  39.             }
  40.             sprintf(& s[strlen(s)] , "%8d" , xx[i])   ;
  41.         }
  42.         strcat(s , "\n")                              ;
  43.         printf("\n\n")                                ;
  44.         printf("%s\n" , s)                            ;
  45.         printf("\n\n")                                ;
  46.     }
  47. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-11 11:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表