解题思路
这是一个进制转换和数位和计算问题。关键点:
-
十进制数位和
:
- 对数字
按
取余,累加每一位
- 如
- 对数字
-
二进制数位和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
算法及复杂度
- 算法:模拟
- 时间复杂度:
,每个数字需要
的时间计算数位和
- 空间复杂度:
,只使用常数额外空间