为什么少了这么多
小甲鱼的正确答案是1229我是1206这是为啥啊
本帖最后由 zltzlt 于 2019-12-22 12:55 编辑
#include <stdio.h>
#include <math.h>
int main() {
int n;
_Bool flag = 1;
long i = 5;
int m = 2;
int x;
while (i <= 10000) {
x = (int) sqrt(i);
for (n = 2; n < x; n ++) {
if (i % n == 0) {
flag = 0;
break;
}
}
if (flag) {
m ++;
}
else {
flag = 1;
}
i ++;
}
printf("%d", m);
return 0;
} 本帖最后由 jackz007 于 2019-12-22 13:04 编辑
正确答案的确是 1229 !
#include <stdio.h>
#include <math.h>
main(void)
{
int d , k , m ;
for(m = 0 , k = 2 ; k < 10000 ; k ++) {
for(d = 2 ; d < (int) sqrt(k) + 1 ; d ++) if(d < k && ! (k % d)) break ;
if (d == (int) sqrt(k) + 1) m ++ ;
}
printf("10000以内共有%d个素数\n" , m) ;
}
编译、运行实况:
C:\Bin>g++ -o x x.c
C:\Bin>x
10000以内共有1229个素数
C:\Bin> zltzlt 发表于 2019-12-22 12:51
我感觉我的这个跟着这个也一样啊想知道哪里错了 本帖最后由 superbe 于 2019-12-22 14:48 编辑
截图13行 for (n = 2; n < x; n++) 少了一个等号吧, 应该是 n <= x
不判断等号会造成误判一些数为素数(例如一些完全平方数)。
另外x = (int)sqrt(i); 应按zltzlt的代码那样移到while里。 superbe 发表于 2019-12-22 13:17
截图13行 for (n = 2; n < x; n++) 少了一个等号吧, 应该是 n
那这个数少的也太多了吧。。。应该不是这个问题 本帖最后由 jackz007 于 2019-12-22 13:57 编辑
孤世星辰 发表于 2019-12-22 13:21
那这个数少的也太多了吧。。。应该不是这个问题
只要把 flag = 1 时的 i 值打印出来就可以看出,楼主的代码完全漏掉了 100 以内的 25 个素数,而 m 初始值是 2,就是说,漏掉的是 25 - 2 = 23 个素数,而 1206 + 23 = 1229。
问题还是出在判断素数的条件上。
下面的代码是完全按楼主的思路修改的版本,供楼主参考:
#include <stdio.h>
#include <math.h>
main(void)
{
int n ;
bool flag = 1 ;
long i = 2 ; // 此处修改
int m = 0 ; // 此处修改
int x ;
while(i <= 10000) {
x = sqrt(i) ; // 此处修改
for(n = 2 ; n < x + 1 ; n ++) { // 此处修改
if(n < i && i % n == 0) { // 此处修改
flag = 0 ;
break ;
}
}
if(flag) {
m ++ ;
} else {
flag = 1 ;
}
i ++ ;
}
printf("10000以内共有%d个素数\n" , m) ;
}
楼主,下次能不能把代码贴成文本
本帖最后由 孤世星辰 于 2019-12-25 16:56 编辑
jackz007 发表于 2019-12-22 13:45
只要把 flag = 1 时的 i 值打印出来就可以看出,楼主的代码完全漏掉了 100 以内的 25 个素数,而 ...
#include <stdio.h>
#include <math.h>
int main()
{
int n;
_Bool flag=1;
long i=5;
int m=2;
int x;
x=(int)sqrt(10000);
while(i<=10000)
{
for(n=2;n<x;n++)
{
if(i%n==0)
{
flag=0;
break;
}
}
if(flag)
{
m++;
}else
{
flag=1;
}
i++;
}
printf("10000以内共有%d个素数!\n",m);
}
噢噢噢噢我会了
页:
[1]