C循环中的孪生素数只给出第一个值
Twin Prime Number in C loop is only giving first value
代码如下:
#include<stdio.h>
void main() {
int num1, num2, num3, fac1 = 0, fac2 = 0, fac3 = 0, i;
clrscr();
for (num1 = 5; num1 < 100; num1 = num1 + 1) {
for (i = 1; i <= num1; i++) {
if (num1 % i == 0) {
fac1 = fac1 + 1;
}
}
num2 = num1 - 2;
for (i = 1; i <= num2; i++) {
if (num2 % i == 0) {
fac2 = fac2 + 1;
}
}
num3 = num1 + 2;
for (i = 1; i <= num3; i++) {
if (num3 % i == 0) {
fac3 = fac3 + 1;
}
}
if (fac1 <= 2 && fac2 <= 2) {
printf("%d and %d are twin prime numbers\n", num1, num2);
}
if (fac1 <= 2 && fac3 <= 2) {
printf("%d and %d are twin prime numbers\n", num1, num3);
}
}
getch();
}
目标是在本例中打印一定数量的孪生素数 100 但当我从 5 开始时,我只得到这个输出
5和3是孪生质数
5和7是孪生素数
在 num1 循环的每次迭代中,您应该清除 fac1..3。一旦 fac1
达到 2,就再也不会遇到 if 子句。
您的代码也显示出很大的优化空间:所有偶数都不是命中的候选者。如果你 运行 num1=5 的代码你测试了 num1-2 和 num1+2。稍后使用 num1=7 再次测试 5 - 7 对。
这里是我的代码,带有单独的 prime-tester:
#include <stdio.h>
bool IsPrime(int num)
{
int i;
for (i = 3; i < num; i+=2)
if (num % i == 0) return false;
return true;
}
void main()
{
int num;
clrscr();
for (num = 3; num < 100; num += 2)
{
if (IsPrime(num) && IsPrime(num+2))
printf("%d and %d are twin prime numbers\n", num, num+2);
}
getch();
}
它只给出了两个结果,因为您用于查找孪生素数的代码没有针对其他数字重复。您将必须对连续的数字重复该过程。
#include<stdio.h>
int isPrime(int n);
void main() {
int num;
clrscr();
for(num = 5; num < 100; num = num+1)
{
if(isPrime(num) && isPrime(num + 2))
{
printf("%d and %d are twin prime numbers\n", num, num+2);
num= num + 2;
}
}
getch();
}
int isPrime(int n)
{
if(n == 1)
{
return 0;
}
int i;
for(i = 2; i < n; i++)
{
if(n % i == 0)
{
// number is not prime
return 0;
}
}
// number is prime
return 1;
}
代码如下:
#include<stdio.h>
void main() {
int num1, num2, num3, fac1 = 0, fac2 = 0, fac3 = 0, i;
clrscr();
for (num1 = 5; num1 < 100; num1 = num1 + 1) {
for (i = 1; i <= num1; i++) {
if (num1 % i == 0) {
fac1 = fac1 + 1;
}
}
num2 = num1 - 2;
for (i = 1; i <= num2; i++) {
if (num2 % i == 0) {
fac2 = fac2 + 1;
}
}
num3 = num1 + 2;
for (i = 1; i <= num3; i++) {
if (num3 % i == 0) {
fac3 = fac3 + 1;
}
}
if (fac1 <= 2 && fac2 <= 2) {
printf("%d and %d are twin prime numbers\n", num1, num2);
}
if (fac1 <= 2 && fac3 <= 2) {
printf("%d and %d are twin prime numbers\n", num1, num3);
}
}
getch();
}
目标是在本例中打印一定数量的孪生素数 100 但当我从 5 开始时,我只得到这个输出 5和3是孪生质数 5和7是孪生素数
在 num1 循环的每次迭代中,您应该清除 fac1..3。一旦 fac1
达到 2,就再也不会遇到 if 子句。
您的代码也显示出很大的优化空间:所有偶数都不是命中的候选者。如果你 运行 num1=5 的代码你测试了 num1-2 和 num1+2。稍后使用 num1=7 再次测试 5 - 7 对。
这里是我的代码,带有单独的 prime-tester:
#include <stdio.h>
bool IsPrime(int num)
{
int i;
for (i = 3; i < num; i+=2)
if (num % i == 0) return false;
return true;
}
void main()
{
int num;
clrscr();
for (num = 3; num < 100; num += 2)
{
if (IsPrime(num) && IsPrime(num+2))
printf("%d and %d are twin prime numbers\n", num, num+2);
}
getch();
}
它只给出了两个结果,因为您用于查找孪生素数的代码没有针对其他数字重复。您将必须对连续的数字重复该过程。
#include<stdio.h>
int isPrime(int n);
void main() {
int num;
clrscr();
for(num = 5; num < 100; num = num+1)
{
if(isPrime(num) && isPrime(num + 2))
{
printf("%d and %d are twin prime numbers\n", num, num+2);
num= num + 2;
}
}
getch();
}
int isPrime(int n)
{
if(n == 1)
{
return 0;
}
int i;
for(i = 2; i < n; i++)
{
if(n % i == 0)
{
// number is not prime
return 0;
}
}
// number is prime
return 1;
}