摘要:本文是PTA编程题"求特殊方程的正整数解"的题解,涵盖题目描述、输入输出格式及C++语言实现,展示双重枚举暴力搜索算法。
题目描述
本题要求对任意给定的正整数N,求方程X² + Y² = N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X² + Y² = N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。
输入样例:
88411输出样例:
10 28 20 22No Solution解题思路
核心问题分析:
给定正整数N,找出所有满足X² + Y² = N且X≤Y的正整数对(X, Y)。由于N最大为10000,X和Y的最大值都不超过100,暴力枚举完全可行。
算法原理:
采用双重循环枚举法。外层循环枚举X(从1到√N),内层循环枚举Y(从X到√N),对每对(X, Y)判断是否满足方程X² + Y² = N。Y从X开始枚举保证了X≤Y的约束条件。
具体计算步骤:
- 读取正整数N
- 初始化标记found=0表示未找到解
- X从1开始递增,直到X² > N为止
- 对每个X,Y从X开始递增,直到Y² > N为止
- 若X² + Y² = N,输出该组解并标记found=1
- 遍历结束后若found仍为0,输出"No Solution"
代码流程说明
- 变量声明:定义N存储输入值,X、Y为循环变量,found标记是否找到解
- 输入读取:使用cin读取正整数N
- 外层循环(X枚举):X从1开始,循环条件X*X ≤ N,每次X自增1
- 内层循环(Y枚举):Y从X开始,循环条件Y*Y ≤ N,每次Y自增1
- 方程判断:若XX + YY == N,则输出X和Y,设置found=1
- 无解判断:双重循环结束后,若found为假,输出"No Solution"
- 程序结束:返回0
代码流程图
解题流程图
代码部分实现
#include<iostream>usingnamespacestd;intmain(void){intN,X,Y,found=0;// N为给定的正整数,X和Y为方程的解,found标记是否找到解cin>>N;// 读取正整数N// 枚举X和Y的值,寻找满足X²+Y²=N的正整数解for(X=1;X*X<=N;X++){// X从1遍历到sqrt(N)for(Y=X;Y*Y<=N;Y++){// Y从X遍历到sqrt(N),保证X≤Yif(X*X+Y*Y==N){// 检查是否满足方程cout<<X<<" "<<Y<<endl;// 输出一组解found=1;// 标记已找到解}}}if(!found){// 未找到任何解cout<<"No Solution"<<endl;// 输出无解提示}return0;}