|
发表于 2019-1-5 19:06:12
|
显示全部楼层
本帖最后由 jackz007 于 2019-1-7 16:55 编辑
你判断素数的逻辑出了问题,看看你的代码:
- for(j = 2 ; j < i ; j++) {
- if(i % j == 0) break ;
- xx[n] = 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[n ++] = i ;
- }
- }
- }
- int main(void)
- {
- int i , k , m , xx[0x800] ;
- char s[0x80000] ;
- m = 1 ;
- k = 200 ;
- if (m > 0 && k > 0) {
- fun(m , k , xx) ;
- s[0] = 0x00 ;
- for(i = 0 ; i < k ; i ++) {
- if (! (i % 5)) {
- if (i) strcat(s , "\n") ;
- } else {
- strcat(s , " , ") ;
- }
- sprintf(& s[strlen(s)] , "%8d" , xx[i]) ;
- }
- strcat(s , "\n") ;
- printf("\n\n") ;
- printf("%s\n" , s) ;
- printf("\n\n") ;
- }
- }
复制代码 |
|