解题思路

  1. 题目要求统计1到n之间与7有关的数字的个数,包括:

    • 是7的倍数(如7, 14, 21等)
    • 包含数字7(如7, 17, 27, 70, 71, 72等)
  2. 实现思路:

    • 遍历1到 的每个数字
    • 判断是否是7的倍数
    • 将数字转为字符串判断是否包含7
    • 满足任一条件就计数加1

代码

#include <iostream>
#include <string>
using namespace std;

bool containsSeven(int num) {
    string str = to_string(num);
    return str.find('7') != string::npos;
}

int main() {
    int n;
    while (cin >> n) {
        int count = 0;
        for (int i = 1; i <= n; i++) {
            if (i % 7 == 0 || containsSeven(i)) {
                count++;
            }
        }
        cout << count << endl;
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    private static boolean containsSeven(int num) {
        return String.valueOf(num).contains("7");
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int count = 0;
            for (int i = 1; i <= n; i++) {
                if (i % 7 == 0 || containsSeven(i)) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}
def contains_seven(num):
    return '7' in str(num)

while True:
    try:
        n = int(input())
        count = 0
        for i in range(1, n + 1):
            if i % 7 == 0 or contains_seven(i):
                count += 1
        print(count)
    except EOFError:
        break

算法及复杂度

  • 算法:遍历判断
  • 时间复杂度: - 需要遍历1到 的每个数字,每个数字需要转字符串判断
  • 空间复杂度: - 只使用了常数额外空间