👨💻个人主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创本文章收录于专栏 【CSDN周赛】
本篇文章目录
- 🌏前言
- 🌏一、勾股数
- 🌸题目描述
- 🌸题解
- 🌏二、最近的回文数
- 🌸题目描述
- 🌸题解
🌏前言
最近参加了 CSDN 官方举办的算法竞赛,恰好最近在学数据结构和算法,于是就顺带参加了第 45 期竞赛,比赛时间是两个小时,这次只有两个算法题,然后几个选择题,一个判断题。
算法题的难度我觉得一般吧,我都做出来了,但是第二个题目有 bug,一直不能通过,应该是测试用例的数据范围有问题。比赛过程中就只能通过 10% 的测试用例,但是后面自己在本地 IDE 里是可以通过题目要求的,希望以后官方大大审题能够更加仔细吧。
下面给大家讲讲这两个题。
🌏一、勾股数
🌸题目描述
勾股数是一组三个正整数,它们可以作为直角三角形的三条边。 比如3 4 5就是一组勾股数。 如果给出一组勾股数其中的两个,你能找出余下的一个吗?
输入输出:输入两个正整数,输出一个正整数表示满足勾股数的另一个数字,如果没有满足条件的第三个数,则输出 -1。
🌸题解
解题思路:这个题要求我们判断是否有对应的第三个数与已知的两个数构成勾股数,而勾股数必须要满足条件式:a*a + b*b = c*c
;即两个较小的数的平方之和等于最大数的平方和,在三角形中,也即两直角边的平方之和等于斜边的平方。但是这里我们并不确定输入的两个数是直角边还是斜边,那么我们可以进行枚举,将这两个已知的数字分别作为斜边和两个直角边,这样就可以得出是否有第三个数与之构成勾股数了。
题解如下:
// CSDN周赛 45期 NO.1
// 花无缺题解
#include <iostream>
#include <math.h>
using namespace std;
int main() {
long a,b;
cin >> a >> b;
long n = 0;
long c; // c 为第三个数
// a 和 b 作为两个直角边, c 为斜边
// 开平方根函数返回的是一个浮点数, 向下取整
c = sqrt(a*a + b*b);
if (c*c==a*a+b*b) {
cout << c;
n++;
}
// a 为 斜边, b 和 c 为直角边
c = sqrt(a*a - b*b);
if (a*a-b*b==c*c) {
cout << c;
n++;
}
// b 为斜边, a 和 c 为直角边
c = sqrt(b*b - a*a);
if (b*b-a*a==c*c) {
cout << c;
n++;
}
// 如果 n 为 0, 那么说明没有满足成为勾股数的第 3 个数, 输出 -1
if (n==0)
cout << -1;
return 0;
}
🌏二、最近的回文数
🌸题目描述
回文数是一个非负整数,它的各位数字从高位到低位和从低位到高位的排列是相同的。 以下是一些回文数的例子: 0 133 525 7997 37273 现在给到一个数,求离它最近的一个回文数(离与它的差的绝对值最小)。如果这个数本身就是回文数,那么就输出它本身。
输入输出:输入一个正整数,输出与它最近的回文数。
🌸题解
解题思路:这个题顾名思义就是求回文数,使用一个 for 循环就可以求出最接近的回文数了,但是这里就出现 bug 了,比如数字 176,它的前面有一个回文数 171,后面有一个回文数 181,它们和176的差值的绝对值都是 5,那么我们应该输出 171 还是 181 呢,题目也没有给出说明,所以这个题问题有点大啊。
以下代码给大家参考下:
欢迎大家提出自己的想法
// CSDN周赛 45期 NO.2
// 花无缺题解
#include <iostream>
using namespace std;
// 判断是否为回文数
bool palindrome(int n) {
long x=0;
long a=n;
while (n) {
x = n%10 + x*10;
n /= 10;
}
if (x == a)
return true;
return false;
}
int main() {
long n;
cin >> n;
for (long i=n;; i++) {
if (palindrome(i)) {
cout << i;
return 0;
}
}
return 0;
}
🌸欢迎
关注
我的博客:@花无缺
持续为你输出有价值的内容~
🥇往期精彩好文:
📢【蓝桥杯省赛感想】
📢【CSS列表详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容
的最大动力!
谢谢!