牛客题解 | 幸运数
题目
解题思路
这是一个进制转换和数位和计算问题。关键点:
-
十进制数位和 \(f(x)\):
- 对数字 \(x\) 按 \(10\) 取余,累加每一位
- 如 \(f(123) = 1 + 2 + 3 = 6\)
-
二进制数位和g(x):
- 对数字 \(x\) 按 \(2\) 取余,累加每一位
- 如 \(123(1111011)\),\(g(123) = 1+1+1+1+0+1+1 = 6\)
-
幸运数判断:
- 遍历 \(1\) 到 \(n\) 的每个数
- 判断 \(f(x) == g(x)\)
代码
#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
算法及复杂度
- 算法:模拟
- 时间复杂度:\(\mathcal{O}(n\log n)\),每个数字需要 \(O(\log n)\) 的时间计算数位和
- 空间复杂度:\(\mathcal{O}(1)\),只使用常数额外空间

浙公网安备 33010602011771号