解题思路

这是一个进制转换和数位和计算问题。关键点:

  1. 十进制数位和

    • 对数字 取余,累加每一位
  2. 二进制数位和g(x)

    • 对数字 取余,累加每一位
  3. 幸运数判断

    • 遍历 的每个数
    • 判断

代码

#include <iostream>
using namespace std;

// 计算十进制数位和
int getDecimalSum(int x) {
    int sum = 0;
    while(x > 0) {
        sum += x % 10;
        x /= 10;
    }
    return sum;
}

// 计算二进制数位和
int getBinarySum(int x) {
    int sum = 0;
    while(x > 0) {
        sum += x & 1;
        x >>= 1;
    }
    return sum;
}

int main() {
    int n;
    while(cin >> n) {
        int count = 0;
        for(int i = 1; i <= n; i++) {
            if(getDecimalSum(i) == getBinarySum(i)) {
                count++;
            }
        }
        cout << count << endl;
    }
    return 0;
}
import java.util.*;

public class Main {
    // 计算十进制数位和
    private static int getDecimalSum(int x) {
        int sum = 0;
        while(x > 0) {
            sum += x % 10;
            x /= 10;
        }
        return sum;
    }
    
    // 计算二进制数位和
    private static int getBinarySum(int x) {
        int sum = 0;
        while(x > 0) {
            sum += x & 1;
            x >>= 1;
        }
        return sum;
    }
    
    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(getDecimalSum(i) == getBinarySum(i)) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}
# -*- coding:utf-8 -*-

def get_decimal_sum(x):
    """计算十进制数位和"""
    sum = 0
    while x > 0:
        sum += x % 10
        x //= 10  # 使用整除
    return sum

def get_binary_sum(x):
    """计算二进制数位和"""
    sum = 0
    while x > 0:
        sum += x & 1
        x >>= 1
    return sum

while True:
    try:
        n = int(input())  # 改用input()
        count = 0
        for i in range(1, n + 1):  # 改用range
            if get_decimal_sum(i) == get_binary_sum(i):
                count += 1
        print(count)  # 添加括号
    except:
        break

算法及复杂度

  • 算法:模拟
  • 时间复杂度:,每个数字需要 的时间计算数位和
  • 空间复杂度:,只使用常数额外空间