想问一下这个程序有哪里错了呢?第一次用flag,这段是求相差2的素数在n内的对数,请各位神仙help me,thank you!
#include<stdio.h>
int main()
{
int n,flag,i,m,k=0,sum=0,t,c;
scanf("%d",&n);
int a[10000];
for(i=0;i<n;i++)
{
a[i]=i;
}
if(n==1)
{
printf("0");
}
else
{
for(m=2;m<n;m++)
{
if(a[i]%m==0)
{
k++;
}
}
if(k!=0)
{
flag=1;
}
else
{
flag=0;
}
if(flag==1)
{
c=a[i];
for(t=2;t<(c+2);t++)
{
if((c+2)%t==0)
{
sum++;
}
}
}
printf("%d",sum);
}
return 0;
}
应该是判断素数和双胞胎素数那里错了,判断一个数是否为素数,可以使用2到这个数之间的数整除来判断是否为素数,如果可以整除说明不是素数,如果都不可以整除说明是素数,你上面的代码恰和这个相反,所以错了,然后还需要判断这个数+2是否为素数,两者都是素数才能判断出一个双胞胎数;
可以使用两个标记来判断双胞胎的数量,第一个标记用来标记用来判断当前的数是否为素数,第二个标记用来判断当前数+2是否为素数,如果两个标记都满足,则双胞胎的数量+1,修改如下:
参考链接:
C++:双胞胎数_五十六朵花的博客-CSDN博客_c++双胞胎数
#include<stdio.h>
int main()
{
int n,flag,i,m,k=0,sum=0,t,c;
scanf("%d",&n);
int a[10000];
for(i=0;i<n;i++)
{
a[i]=i;
}
if(n==1)
{
printf("0");
}
else
{
int firstPrime,secondPrime;
int twins=1;
for(int i=2;i<=n;i++){
firstPrime=1;//默认当前数为素数
for(int j=2;j<i;j++){
if(i%j==0){ //如果当前数能被2到当前数之间的数整除,则当前数不是素数
firstPrime=0;
break;
}
}
if(firstPrime==1){ //如果当前数是素数,则判断当前数+2是否为素数
secondPrime=1; //默认当前数+2为素数
for(int j=2;j<i+2;j++){
if((i+2)%j==0){ //如果当前数+2能被2到当前数+2之间的数整除,则说明当前数+2不是素数
secondPrime=0;
break;
}
}
if((i+2)>n){ //当当前数大于输入的n,则第二个素数不满足要求,第二个素数标记置0
secondPrime=0;
}
if(secondPrime==1){ //如果当前数+2为素数,则双胞胎数量+1,同时让i++,配合for循环的i++, 即下一次开始从当前数+2开始判断
sum++;
i++;
}
}
}
//
// for(m=2;m<n;m++)
// {
// if(a[i]%m==0)
// {
// k++;
// }
// }
//
//
// if(k!=0)
// {
// flag=1;
// }
// else
// {
// flag=0;
// }
//
// if(flag==1)
// {
// c=a[i];
// for(t=2;t<(c+2);t++)
// {
// if((c+2)%t==0)
// {
// sum++;
// }
// }
// }
printf("%d",sum);
}
return 0;
}
else的逻辑完全不对
你可以先把n以内的素数个数求出,再除以2
所以应为:
#include<bits/stdc++.h>
using namespace std;
bool prime(int x) {
if (x <= 1) {
return 0;
}
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int n, sum = 0;
scanf("%d", &n);
if(n == 1) {
printf("0");
} else {
for (int i = 2; i < n; i++) {
if (prime(i)) {
sum++;
}
}
printf("%d", sum / 2);
}
return 0;
}
我把码风改成我自己的风格了,希望别介意~