- 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;
else
cout << "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");
else
System.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;
else
cout << "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 - 4ac
int 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;
else
return 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;
else
return (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' 的结果是 1
sum += 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' 的结果是 1
sum += 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日开始的天数计数,初始值为1
int day = 1;
// 定义变量sum,用于累加满足晨跑条件的天数,初始值为0
int 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加1
sum++;
}
// 每经过一天,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);
}
}
最后,感谢您的阅读,期待您的一键三连!