4978 勾股定理
经验值:1200 时间限制:1000毫秒
题目描述 Description
所谓勾股数,是指满足形如x*x+y*y=z*z这样的(x,y,z)称为一组勾股数。
找出N(包括N)以内的勾股数。如果找不到,则输出No
输入描述 Input Description
一行:一个整数n,(0<n<5000)
输出描述 Output Description
若干行:每行一组勾股数。按第一个数从小到大输出,第一个相同则按第二数第小到大输出。
样例输入 Sample Input
5
样例输出 Sample Output
3 4 5
#include<iostream>
#include<cmath>
#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
int main(){
//freopen("1106.in","r",stdin);
//freopen("1106.out","w",stdout);
long long b=0,n,cnt=0,sum=0,m;
bool f=0;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
for(int k=j+1;k<=n;k++){
if(sqrt(i*i+j*j)==k){
cout<<i<<" "<<j<<" "<<k<<endl;
f=1;
}
}
}
}
if(f==0){
cout<<"No";
}
fclose(stdin);
fclose(stdout);
return 0;
}
超时???
枚举x和y的时候,直接算出x*x+y*y是不是完全平方数,且小于n
for(int x=1;x<=n;x++){
for(int y=x+1;y<=n;y++){
int z=x*x+y*y;
if(pf(z)&&sqrt(z)<=n){
cout<<x<<" "<<y<<" "<<sqrt(z)<<endl;
}
}
}
判断x是不是完全平方数
(int(sqrt(x))*int(sqrt(x))==x) //是完全平方数
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cmath>
#include<iomanip>
using namespace std;
int main(){
bool f=0;
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(sqrt(i*i+j*j)==int(sqrt(i*i+j*j))){
if(sqrt(i*i+j*j)<=n){
cout<<i<<' '<<j<<' '<<sqrt(i*i+j*j)<<endl;
f=1;
}
}
}
}
if(f==0){
cout<<"No";
}
return 0;
}
你可以不用枚举k一旦枚举,三重循环就会超时
但是,二重循环不会超时!
你可以直接根据i,j推算出k!
吕若朴在2021-08-01 23:40:26追加了内容
你直接判断i*i+j*j是不是平方数就可以了!
如果是平方数,k=sqrt(i*i+j*j)
省了一重循环
Time Limit Exceeded:50分
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin>>n;
for (long long i=1; i<=n; i++) {
for (long long j=i+1; j<=n; j++) {
for (long long k=j+1; k<=n; k++) {
if (i*i + j*j == k*k) {
cout << i << ' ' << j << ' ' << k << endl;
}
}
}
}
return 0;
}
我的思路好像跟你的差不多,你可以对照一下(我的AC了
循环1~n(i)
循环i~n(j)
循环i~n(k)
if(i的平方+j的平方等于k的平方){
cout<<i<<" "<<j<<" "<<k<<endl;
cnt++;
}
}
}
}
如果cnt是0,输出No