题目:
小明同学学习了不同的进制之后,拿起了一些数字做起了游戏。小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中,二进制数也很常用。
现在对于一个数字x,小明同学定义出了两个函数f(x)和g(x)。 f(x)表示把x这个数用十进制写出后各个数位上的数字之和。如f(123)=1+2+3=6。
g(x)表示把x这个数用二进制写出后各个数位上的数字之和。如123的二进制表示为1111011,那么,g(123)=1+1+1+1+0+1+1=6。
小明同学发现对于一些正整数x满足f(x)=g(x),他把这种数称为幸运数,现在他想知道,小于等于n的幸运数有多少个?
输入描述:
每组数据输入一个数n(n<=100000)
输出描述:
每组数据输出一行,小于等于n的幸运数个数。
示例1
输入
21
输出
3
思路:
求十进制和二进制各位的和,使用sum+=n%10,n/=10;和sum+=n%2,n/=2;
输入用Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
1 import java.util.*; 2 public class LuckyNumber { 3 //十进制求和 4 public static int f(int n){ 5 int sum = 0; 6 while(n!=0){ 7 sum += n%10; 8 n/=10; 9 } 10 return sum; 11 } 12 //二进制求和 13 public static int g(int n){ 14 int sum = 0; 15 while(n!=0){ 16 sum += n%2; 17 n/=2; 18 } 19 return sum; 20 } 21 public static void main(String[] args) { 22 // TODO Auto-generated method stub 23 Scanner scanner = new Scanner(System.in); 24 while(scanner.hasNext()){ 25 int n = scanner.nextInt(); 26 int count = 0; 27 for(int i = 1; i <= n;i++){ 28 if(f(i)==g(i)){ 29 count++; 30 //System.out.println(i); 31 } 32 } 33 System.out.println(count); 34 } 35 } 36 37 }