T1 直角三角形的判定
题目描述
给定三个正整数表示三角形的三条边,请判定它是否为直角三角形。
输入格式
第一行:三个整数 a,b 与 c
输出格式
若可以构成一个直角三角形,输出 Right Triangle
否则,输出 No
数据范围
1 ≤ a , b , c ≤ 1000
样例输入1:
3 4 5
样例输出1:
Right Triangle
样例输入2:
3 3 3
样例输出2:
NO
思路:简单的if语句分支
根据勾股定理的逆定理判断直角三角形
#include <bits/stdc++.h>
using namespace std;
int a, b, c;
int main(){
cin >> a >> b >> c;
if (a * a + b * b == c * c || b * b + c * c == a * a || a * a + c * c == b * b)
cout << "Right Triangle" << endl;
else
cout << "No" << endl;
return 0;
}
时间复杂度O(1),实测100分
T2 因子分解
题目描述
给定一个正整数 n,请将它分解为素数的乘积。
例如 60 = 2 × 2 × 3 × 5
输入格式
单个整数表示 n
输出格式
若干整数表示 n 的素因子,按照从小到大的顺序输出。
数据范围
2 ≤ n ≤ 1 , 000 , 000 , 000
样例输入1:
60
样例输出1:
2 2 3 5
样例输入2:
3
样例输出2:
3
思路1:循环枚举因子
while循环查找n的因子,直到其为1。
#include <bits/stdc++.h>
using namespace std;
int num;
int main(){
cin >> num;
int i = 2;
while (num != 1){
if (num % i == 0){
cout << i << " ";
num /= i;
}else
i++;
}
return 0;
}
算法复杂度O(n),上海竞赛满分,但实际上有缺陷
思路2:只枚举到根号n
理由:因为当i> n \sqrt {n} n时(i为n素因子),有且只有这一个因子(否则其因子乘积一定大于n)
于是有了以下算法:
#include <bits/stdc++.h>
using namespace std;
int num;
int main(){
cin >> num;
int i = 2, n = sqrt(num);
while (num != 1 && i <= n){
if (num % i == 0){
cout << i << " ";
num /= i;
}else
i++;
}
if (num != 1) cout << num;
return 0;
}
时间复杂度O( n