花了点时间改写并且加了注解, 若还是连看都看不懂, 我认为你该被当。
我直接给你答案, 老实说这跟作弊没两样了。
复制程式
#include <stdio.h>
#include <math.h> // 因为有用到 sqrt(),所以才宣告。
int p(int i) // 此为判断是否为质数之副程式,若输入值为质数便回传 1,否则回传 0。
{
int x = (int)sqrt((double)i), r = 1, l; // 对'输入质i'开根号,然后储存于'变数x'。
for (l = 3; l <= x; l += 2)
{if (i % l == 0) r = 0;}
return r;
}
int q(int a, int b) // a 是'输入值a',b 是'输入值b'。
{
int r = 1, l; // r 是运算结果,若输入值ab区间有双生质数便设为 0 ,否则为 1 ,l 是’回圈计数变数’。
if (!(a & 1)) a += 1; // 以及闸来作逻辑判断,若'输入值a'是偶数就加 1 ,使其变为奇数。
for (l = a; l < b; l += 2) // 单纯只考虑奇数(因为除了 2 不可能有质数同时为偶数的情况),故回圈每次不只加 1 而是加 2。
{
if (p(l)) // 呼叫'副程式p'来判断’回圈计数变数’是否为质数。
{
if (p(l + 2)) // 若’回圈计数变数’是质数便再呼叫'副程式p'来判断’回圈计数变数’ + 2 是否也为质数。
{
printf("%d\t%d\n", l, l + 2); // 输出双生质数。
r = 0;
}
}
}
r ? printf("此范围内无双生质数\n==========\n") : printf("==========\n"); // 若输入值ab区间无双生质数便输出'此范围内无双生质数=========='的讯息,否则只输出'=========='的讯息。
}
int main(void)
{
int a, b, l; // a 是'输入值a',b 是'输入值b',l 是回圈计数变数。
while (scanf("%d", &a) == 1) // 读取键盘输入的数值并储存为'输入值a'。
{
if (a == -1) return 0; // 若'输入值a'是 -1 便结束此程式。
scanf("%d", &b); // 读取键盘输入的数值并储存为'输入值b'。
a < 2 ? printf("请注意! a一定要大于或等于2。\n==========") : a < b ? q(a, b) : q(b, a); // 若'输入值a'小于 2 便输出错误讯息,否则就将'输入值a'与'输入值b'交由'副程式q'来处理。
}
return 0;
}