求助:实现输出指定位数反转素数对的C语言程序
反转素数对程序实现求助
问题定义
一个数与其反转数组成数对,若两者均为素数,则称为反转素数对。例如,13和31是两位数反转素数对,107和701是三位数反转素数对。
程序需求
编写程序,输出所有n(2≤n≤5)位的反转素数对:
- 若输入的n小于2或大于5,输出"Wrong input."并终止程序;
- 输出时每5对换一行,且仅输出第一个数小于第二个数的数对。
示例
- 输入:1 → 输出:Wrong input.
- 输入:3 → 输出:
(107,701)(113,311)(149,941)(157,751)(167,761) (179,971)(199,991)(337,733)(347,743)(359,953) (389,983)(709,907)(739,937)(769,967) There are 14 results.
当前状态与已有代码
我已经掌握了判断单个反转素数的方法,但不清楚如何完成整个程序,附上已写的代码,寻求实现提示:
#include <stdio.h> int checkPrime(int n) { int i, isPrime = 1; if (n == 0 || n == 1) { isPrime = 0; } else { for(i = 2; i <= n/2; ++i) { if(n % i == 0) { isPrime = 0; break; } } } return isPrime; } int main (void) { int a, reverse = 0, remainder, flag=0; scanf("%d",&a); int temp = a; while (temp!=0) { remainder = temp%10; reverse = reverse*10 + remainder; temp/=10; } if (checkPrime(a)==1) { if (checkPrime(reverse)==1){ printf("YES\n"); flag=1; } } if (flag==0) printf("NO\n"); }
实现提示
- 输入合法性校验:在
main函数开头先读取n,判断n是否在2到5之间,若不在直接输出"Wrong input.",然后用return 0;终止程序。 - 确定遍历区间:计算n位数的起始值(比如n=2时是10,n=3时是100,公式为
start = pow(10, n-1),或用循环计算)和结束值(end = pow(10, n) - 1),遍历从start到end的每个数。 - 过滤无效反转数:计算当前数的反转数后,检查反转数是否也是n位数(比如n=2时反转数不能小于10),如果不是直接跳过。
- 避免重复数对:只有当当前数 < 反转数时,才判断两者是否都是素数,避免重复输出同一对的两种顺序。
- 素数判断优化:把
checkPrime函数的循环上限改成sqrt(n),大幅减少循环次数提升效率(需引入math.h头文件,或自行计算平方根)。 - 输出格式控制:用计数器统计符合条件的数对数量,每输出5对就换行;全部输出完成后,打印总数,格式为
There are X results.。
内容的提问来源于stack exchange,提问作者123krikit krukut
相关产品推荐
相关产品推荐

