- 10.14 直角三角形
- 1. 题目
- 2. 解题思路
- 3. 代码实现(AC_Code)
- 10.15 回文判定
- 1. 题目
- 2. 解题思路
- 3. 代码实现(AC_Code)
- 10.16 二次方程
- 1. 题目
- 2. 解题思路
- 3. 代码实现(AC_Code)
- 10.17 互质
- 1. 题目
- 2. 解题思路
- 3. 代码实现(AC_Code)
- 10.18 穿越时空之门
- 1. 题目
- 2. 解题思路
- 3. 代码实现(AC_Code)
- 10.19 元音大写
- 1. 题目
- 2. 解题思路
- 3. 代码实现(AC_Code)
- 10.20 跑步
- 1. 题目
- 2. 解题思路
- 3. 代码实现(AC_Code)
上期回顾:【每日一题】24.10.7 - 24.10.13
个人主页:C_GUIQU
归属专栏:每日一题
10.14 直角三角形
1. 题目
直角三角形
2. 解题思路
用if判断,列出三种形式的勾股定理。
3. 代码实现(AC_Code)
- C++
#include <iostream>using namespace std;int main()
{int a,b,c;cin >> a >> b >> c;if(a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a)cout << "YES" << endl;elsecout << "NO" << endl;return 0;
}
- Java
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int a = scan.nextInt();int b = scan.nextInt();int c = scan.nextInt();if(a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a)System.out.println("YES");elseSystem.out.println("NO");scan.close();}
}
10.15 回文判定
1. 题目
回文判定
2. 解题思路
从前往后遍历的同时从后往前遍历,判断对应字符是否相等。
3. 代码实现(AC_Code)
- C++
#include <iostream>using namespace std;int main()
{string str;cin >> str;for (int i = 0, j = str.length() - 1; i < str.length() / 2; i++, j--){if(str[i] != str[j]){cout << "N" << endl;return 0;} }cout << "Y" << endl;return 0;
}
- Java
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);String str = scan.next();for (int i = 0, j = str.length() - 1; i < j; i++, j--) {if(str.charAt(i) != str.charAt(j)) {System.out.println("N");return ;}}System.out.println("Y");scan.close();}
}
10.16 二次方程
1. 题目
二次方程
2. 解题思路
具体见代码
3. 代码实现(AC_Code)
- C++
#include <iostream>
#include <cmath>using namespace std;int main()
{int a, b, c;cin >> a >> b >> c;int delta = b * b - 4 * a * c;if(delta < 0)cout << "NO" << endl;else{// 用double相对于int更准确double x1 = (-b + sqrt(delta) / 2.0 * a);double x2 = (-b + sqrt(delta) / 2.0 * a);if(x1 == (int)x1 && x2 == (int)x2)cout << "YES" << endl;elsecout << "NO" << endl;}return 0;
}
- Java
import java.util.Scanner;
import java.lang.Math; // 用于调用sqrt函数public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int b = scanner.nextInt();int c = scanner.nextInt(); // 读取输入的三个整数// 判别式 delta = b^2 - 4acint delta = b * b - 4 * a * c;// 检查方程是否有实数根,并且这些根是否为整数if (delta < 0) {// 如果判别式小于0,则方程没有实数根System.out.println("NO");} else {// 计算两个根double x1 = (-b + Math.sqrt(delta)) / (2.0 * a);double x2 = (-b - Math.sqrt(delta)) / (2.0 * a);// 检查根是否为整数if (x1 == Math.floor(x1) && x2 == Math.floor(x2)) {System.out.println("YES");} else {System.out.println("NO");}}scanner.close();}
}
10.17 互质
1. 题目
互质
2. 解题思路
用欧几里得算法找出任意两个正整数的最大公约数,判断是否为1,为1则是质数,反之则不是质数。
法1:递归
法2:迭代
在递归版本中,函数不断地调用自身,直到 b 为 0,此时返回 a,即为最大公约数。在迭代版本中,使用一个循环不断更新 a 和 b 的值,直到 b 为 0,此时 a 就是最大公约数。
【欧几里得算法】又称辗转相除法,是用来求两个正整数最大公约数的一种方法。
算法原理:
假设两个数为a和b(a>b),用a除以b得到余数r,若r为0,则b就是a和b的最大公约数;若r不为0,则用b除以r,再得到新的余数,继续这个过程,直到余数为0为止,此时的除数就是a和b的最大公约数。
3. 代码实现(AC_Code)
- C++
【法1】递归
#include <iostream>using namespace std;int gcd(int a, int b)
{if(b == 0)return a;elsereturn gcd(b, a % b);
}int main()
{int count = 0;for(int i =1; i <= 2020; i++){if(gcd(i, 1018) == 1)count++;}cout << count << endl;return 0;
}
【法2】迭代
#include <iostream>using namespace std;int gcd(int a, int b)
{while(b != 0){int temp = b;b = a % b;a = temp;}return a;
}int main()
{int count = 0;for(int i =1; i <= 2020; i++){if(gcd(i, 1018) == 1)count++;}cout << count << endl;return 0;
}
- Java
【法1】递归
public class Main {public static int gcd(int a, int b) {if(b == 0)return a;elsereturn (gcd(b,a % b));}public static void main(String[] args) {int count = 0;for(int i = 1; i <= 2020; i++) {if(gcd(i, 1018) == 1)count++;}System.out.println(count);}
}
【法2】迭代
public class Main {public static int gcd(int a, int b) {while(b != 0) {int temp = b;b = a % b;a = temp;}return a;}public static void main(String[] args) {int count = 0;for(int i = 1; i <= 2020; i++) {if(gcd(i, 1018) == 1)count++;}System.out.println(count);}
}
10.18 穿越时空之门
1. 题目
穿越时空之门
2. 解题思路
具体见代码。
3. 代码实现(AC_Code)
- C++
#include <iostream>
#include <string>using namespace std;// 计算给定整数 n 的二进制表示中各位数字之和的函数
int getBinarySum(int n)
{string binary = "";// 将整数 n 转换为二进制表示并存入字符串 binary 中while(n > 0){binary = to_string(n % 2) + binary;n /= 2;}int sum = 0;// 遍历二进制字符串,计算各位数字之和for(char digit : binary){// 将字符类型的数字字符转换为实际数字值并累加到 sum 中// 例如,'1' - '0' 的结果是 1sum += digit - '0';}return sum;
}// 计算给定整数 n 的四进制表示中各位数字之和的函数
int getQuaternarySum(int n)
{string Quaternary = "";// 将整数 n 转换为四进制表示并存入字符串 Quaternary 中while(n > 0){Quaternary = to_string(n % 4) + Quaternary;n /= 4;}int sum = 0;// 遍历四进制字符串,计算各位数字之和for(char digit : Quaternary){// 将字符类型的数字字符转换为实际数字值并累加到 sum 中sum += digit - '0';}return sum;
}int main()
{int count = 0;// 遍历从 1 到 2024 的所有整数for(int i = 1; i <= 2024; i++){// 如果当前整数 i 的二进制表示各位数字之和等于四进制表示各位数字之和if(getBinarySum(i) == getQuaternarySum(i))count++;}// 输出符合穿越条件的勇者人数cout << count << endl;return 0;
}
- Java
public class BinaryQuaternaryEquality {// 计算给定整数 n 的二进制表示中各位数字之和的方法public static int getBinarySum(int n) {// 将整数 n 转换为二进制字符串表示,例如 n = 5 时,返回 "101"String binary = Integer.toBinaryString(n);int sum = 0;// 将二进制字符串转换为字符数组进行遍历for (char digit : binary.toCharArray()) {// 将字符类型的数字字符转换为实际数字值并累加到 sum 中,// 例如,'1' - '0' 的结果是 1sum += digit - '0';}return sum;}// 计算给定整数 n 的四进制表示中各位数字之和的方法public static int getQuaternarySum(int n) {// 将整数 n 转换为四进制字符串表示,例如 n = 5 时,返回 "11"String quaternary = Integer.toString(n, 4);int sum = 0;// 将四进制字符串转换为字符数组进行遍历for (char digit : quaternary.toCharArray()) {// 将字符类型的数字字符转换为实际数字值并累加到 sum 中sum += digit - '0';}return sum;}public static void main(String[] args) {int count = 0;// 遍历从 1 到 2024 的整数for (int i = 1; i <= 2024; i++) {// 如果当前整数 i 的二进制表示各位数字之和等于四进制表示各位数字之和if (getBinarySum(i) == getQuaternarySum(i)) {count++;}}// 输出符合穿越条件的勇者人数System.out.println(count);}
}
10.19 元音大写
1. 题目
元音大写
2. 解题思路
遍历字符串,逐个判断是否为元音字母,转换为大写字母后输出最终的字符串。
3. 代码实现(AC_Code)
- C++
#include <iostream>
#include <string>using namespace std;int main()
{string str;cin >> str;for (int i = 0; i < str.length(); i++){if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u')str[i] = toupper(str[i]);}cout << str << endl;return 0;
}
- Java
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);String str = scan.next();// 将输入的字符串转换为字符数组char[] charArray = str.toCharArray();for (int i = 0; i < charArray.length; i++) {if (charArray[i] == 'a' || charArray[i] == 'e' || charArray[i] == 'i' || charArray[i] == 'o' || charArray[i] == 'u')// 将当前字符转换为大写形式charArray[i] = Character.toUpperCase(charArray[i]);}// 将修改后的字符数组转换回字符串并输出System.out.println(new String(charArray));scan.close();}
}
10.20 跑步
1. 题目
跑步
2. 解题思路
具体见代码。
3. 代码实现(AC_Code)
- C++
#include <iostream>using namespace std;int main()
{// 定义一个数组month,用于存储每个月的天数// 这里按照非闰年的情况初始化,2月为28天int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 定义变量day,用于模拟从2022年1月1日开始的天数计数,初始值为1int day = 1;// 定义变量sum,用于累加满足晨跑条件的天数,初始值为0int sum = 0;// 外层循环,遍历12个月for (int i = 0; i < 12; i++){// 内层循环,遍历每个月的天数for (int j = 1; j <= month[i]; j++){// 判断当前日期是否满足晨跑条件// 如果是周六(day % 7 == 1)或者周日(day % 7 == 2)// 或者是每月的1日、11日、21日、31日,则满足条件if (day % 7 == 1 || day % 7 == 2 || j == 1 || j == 11 || j == 21 || j == 31){// 如果满足晨跑条件,将sum加1sum++;}// 每经过一天,day的值增加1,模拟天数的递增day++;}}// 输出满足晨跑条件的总天数cout << sum << endl;return 0;
}
- Java
public class Main {public static void main(String[] args) {int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, day = 1, sum = 0;for(int i = 0; i < 12; i++) {for(int j = 1; j <= month[i]; j++) {if(day % 7 == 1 || day % 7 == 2 || j == 1 || j == 11 || j == 21 || j == 31)sum++;day++;}}System.out.println(sum);}
}
最后,感谢您的阅读,期待您的一键三连!