【每日一题】24.10.14 - 24.10.20

  • [10.14 直角三角形](#10.14 直角三角形)
    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现(AC_Code)](#3. 代码实现(AC_Code))
  • [10.15 回文判定](#10.15 回文判定)
    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现(AC_Code)](#3. 代码实现(AC_Code))
  • [10.16 二次方程](#10.16 二次方程)
    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现(AC_Code)](#3. 代码实现(AC_Code))
  • [10.17 互质](#10.17 互质)
    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现(AC_Code)](#3. 代码实现(AC_Code))
  • [10.18 穿越时空之门](#10.18 穿越时空之门)
    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现(AC_Code)](#3. 代码实现(AC_Code))
  • [10.19 元音大写](#10.19 元音大写)
    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现(AC_Code)](#3. 代码实现(AC_Code))
  • [10.20 跑步](#10.20 跑步)
    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现(AC_Code)](#3. 代码实现(AC_Code))


上期回顾:【每日一题】24.10.7 - 24.10.13
个人主页:C_GUIQU
归属专栏:每日一题

10.14 直角三角形

1. 题目

直角三角形

2. 解题思路

用if判断,列出三种形式的勾股定理。

3. 代码实现(AC_Code)

  • C++
cpp 复制代码
#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
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++
cpp 复制代码
#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
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++
cpp 复制代码
#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
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】递归

cpp 复制代码
#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】迭代

cpp 复制代码
#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】递归

java 复制代码
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】迭代

java 复制代码
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++
cpp 复制代码
#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
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++
cpp 复制代码
#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
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++
cpp 复制代码
#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
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);
    }
}

最后,感谢您的阅读,期待您的一键三连!

相关推荐
凉风听雪1 个月前
VsCode插件:前端每日一题
前端·ide·vscode·每日一题
sweetheart7-72 个月前
LeetCode54. 螺旋矩阵(2024秋季每日一题 21)
线性代数·矩阵·力扣·数组·每日一题
sweetheart7-73 个月前
LeetCode152. 乘积最大子数组(2024秋季每日一题 2)
数据结构·算法·动态规划·dp·每日一题
sweetheart7-73 个月前
LeetCode172. 阶乘后的零(2024秋季每日一题 1)
数据结构·算法·leetcode·每日一题·hot100
无名之逆6 个月前
54. 螺旋矩阵【rust题解】
开发语言·前端·算法·rust·力扣·每日一题
菜菜的小彭6 个月前
2024-5-12——吃掉 N 个橘子的最少天数
java·算法·leetcode·面试·职场和发展·每日一题
无名之逆6 个月前
超级幂积【rust题解】
开发语言·前端·算法·rust·力扣·每日一题
聪ζ7 个月前
如何保证集合是线程安全的? ConcurrentHashMap 如何?
java·安全·每日一题
聪ζ7 个月前
每日一题:对比Vector、ArrayList、LinkedList有何区别❓
java·数组·每日一题