| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
各位大佬,有人能帮忙解答一下吗?我这个程序在计数质数个数时出现了问题,计数应该用在哪里才对? 
/*找出质数个数*/ 
#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 
#include<math.h> 
int main() 
{ 
        int e,b,c,d,sum,n; 
        int flag=0,i,j,a[200]; 
        srand((int)time(0)); 
        for(i=0;i<200;i++){ 
                a[i]=rand()%9000+1000; 
                e=a[i]/1000; 
                b=a[i]%1000/100; 
                c=a[i]%100/10; 
                d=a[i]%10; 
                sum=e+b+c+d; 
                n=(int)sqrt(sum); 
                for(j=2;j<n;j++){ 
                        if(sum%j!=0){ 
                                flag++; 
                        }//计数处有问题 
                         
                } 
        } 
        printf("%d\n",flag); 
}
四个个位数相加得的数比较小,不必考虑负担而采用sqrt函数。 
你用了后,你有没有考虑这四位数之和有可能等于2,3,4,5,…… 
如果采用开方,那么前两个是小于2的,你使用j=2开始并规定j<n才会有后面的计数判断 
然而2和3它是素数,它们开方后均小于2,那么j大于它们,不符合j<n的条件,因此不会进行计数 
对于4和5,由于n被你int了,因此,它们的n值是2,也不符合j<n的要求,也不会进行计数,这个要一直到n大于等于3时才会正常,也就是sum>=9时。 
至于你说的flag超过200个,那是因为它在你的循环里面,对于sum进行取余j时,j在变化中,每变一次,发现符合条件就计数,这样,一个sum会被计算多次 
假设其中一个四位数是9998,它的和是35,n为5,j会取值为2,3,4一共三次判断。当35%2时,会计一次数,因为!=0。当j为3时,因为!=0又会再计一次数!这样就重复了 
 
 
 |   
 
 
 
 |