首页 > 试题广场 >

幸运数

[编程题]幸运数
  • 热度指数:23993 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小明同学学习了不同的进制之后,拿起了一些数字做起了游戏。小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中,二进制数也很常用。现在对于一个数字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) ,他把这种数称为幸运数,现在他想知道,大于0且小于等于n的幸运数有多少个?

数据范围:

输入描述:
每组数据输入一个数


输出描述:
每组数据输出一行,小于等于n的幸运数个数。
示例1

输入

21

输出

3
package package1;

import java.math.BigInteger;
import java.util.Scanner;

/**
 * @author jiaqing.xu@hand-china.com
 *         幸运数
 */
public class LuckyNumber {

    /**
     * 求一个数字的十进制写法的各个位上数字和
     *
     * @param number
     * @return
     */
    public static int getDecimalSum(int number) {
        String stringNumber = number + "";
        char[] charArray = stringNumber.toCharArray();
        int sum = 0;
        for (int i = 0; i < charArray.length; i++) {
            sum += Integer.valueOf(String.valueOf(charArray[i]));
        }
        return sum;
    }

    /**
     * 求一个数字二进制写法各个位置数字之和
     * @param number
     * @return
     */
    public static int getBinarySum(int number) {
        BigInteger bigInteger = new BigInteger(String.valueOf(number));
        String binaryString = bigInteger.toString(2);
        char[] charArray = binaryString.toCharArray();
        int sum = 0;
        for (int i = 0; i < charArray.length; i++) {
            sum += Integer.valueOf(String.valueOf(charArray[i]));
        }
        return sum;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int endNumber = sc.nextInt();
            int allCount = 0;
            for (int i = 1; i <= endNumber; i++) {
                if (getDecimalSum(i) == getBinarySum(i)) {
                    allCount++;
                }
            }
            System.out.println(allCount);
        }
    }
}
编辑于 2018-10-21 10:18:26 回复(1)
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int countsum=0; //存储幸运数个数
        for (int i = 1; i <=num; i++) {
            int count=0; 
            for (int j = 0; j < 32; j++) {
                if(((i >> j) & 1) == 1){     //判断有多少个1,并相加,和为 count,是 g(x)
                    count++;
                }
            }
            String s = i+"";
            char[] arr = s.toCharArray();
            int sum = 0;  //sum是各位相加的和,是f(x)
            for (char c : arr) {
                sum = sum + (c-48);  //48是 0 的ASCII码值也可以用  '0'  代替
            }
            if(sum == count){  //判断f(x)是否等于g(x)
                //System.out.println(i);
                countsum++;
            
        }
        System.out.println(countsum);
    }
}
发表于 2018-07-26 09:38:27 回复(0)
//菜菜的自己
import java.util.*;
public class Main{
    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(f(i)==g(i)){
                count++;
            }}
            System.out.println(count);
        }
        sc.close();
    }
    private static int f(int n){
        int res=0;
        while(n>0){
            res+=n%10;
            n/=10;
        }
        return res;
    }
    private static int g(int n){
        int res=0;
        while(n!=0){
            res++;
            n=n&(n-1);
        }
        return res;
    }
}


发表于 2018-06-20 18:00:51 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();
            int count = 0;
            for (int i = 1; i <= n; i++) {
                if (g(i) == f(i)) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }

    /**
     * 十进制数n各个数位置上的和
     * @param n
     */
    private static int g(int n) {
        // TODO Auto-generated method stub
        int sum = 0;
        String str = String.valueOf(n);
        for (int i = 0; i < str.length(); i++) {
            sum += str.charAt(i) - 48;
        }
        return sum;
    }

    /**
     * 十进制数n转成二进制
     * 求各个位置上的数之和
     * @param n
     */
    private static int f(int n) {
        // TODO Auto-generated method stub
        int sum = 0;
        String str = Integer.toBinaryString(n);
        for (int i = 0; i < str.length(); i++) {
            sum += str.charAt(i) - 48;
        }
        return sum;
    }
}
发表于 2018-05-16 21:04:36 回复(0)
//统计二进制中1的数目可改为(最优解):n = (n-1)&n 
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int num = in.nextInt();
            int count = 0;
            for (int i = 1; i <= num; i++)
                if (getSum(i, 10) == getSum(i, 2))
                    count++;
            System.out.println(count);
        }
    }
    private static int getSum(int num, int scale) {
        int sum = 0;
        while (num > 0) {
            sum += num % scale;
            num /= scale;
        }
        return sum;
    }
}

编辑于 2017-12-07 18:44:23 回复(0)

import java.util.Scanner;

/**

  • @author AmVilCres
    */
    public class Main {

    public static void main(String[] args) {

     //System.out.println(f(0));
     Scanner sc = new Scanner(System.in);
     int n = sc.nextInt();
     int count = 0;
    
     for(int i=1; i<=n; i++) {
         if(f(i) == g(i))
             count++;
     }
    
     System.out.println(count);
    

    }

    public static int f(int x) {

     String xStr = x+"";
     char[] chs = xStr.toCharArray();
     int fSum = 0;
     for(char c :chs) {
         fSum += Integer.parseInt((c+""));
     }
     return fSum;
    

    }

    public static int g(int x) {

     int cnt=0;
     while(x!=0) {
         cnt++;
         x = x&(x-1);
     }
    
     return cnt;
    

    }
    }

发表于 2017-11-01 19:40:51 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
            int n=sc.nextInt();
        int count=0;
        for(int i=1;i<=n;i++){
            if(f(i)==g(i))
                count++;
        }
        System.out.println(count);
    }
    public static int f(int n){
        int sum=0;
        while(n!=0){
            sum+=n%10;
            n=n/10;
        }
        return sum;
    }
    //把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0,
    //那么一个整数的二进制表示有多少个1,就可以进行多少次这样的操作

    public static int g(int n){
        int sum=0;
        while(n!=0){
            n=n&(n-1);
            sum++;
        }
        return sum;
}
}

发表于 2017-10-19 20:07:36 回复(0)
好多人都是从int角度开始。这种思路是从String角度出发。
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
			        Scanner in = new Scanner(System.in);
			        int io=in.nextInt();
			        int sss=0;
			        for(int c=0;c<=io;c++){
				        String str = String.valueOf(c);
				        int sum=0;
				        for(int j=0;j<str.length();j++){
				        	char s=str.charAt(j);
				        	int temp=Integer.parseInt(String.valueOf(s));  //char转int 方法
				        	sum+=temp;
				        }
				        int number=Integer.parseInt(str);  
				        String secone=Integer.toBinaryString(number);
				        int count = 0;	
				        for(int i=0;i<secone.length();i++){
				        	char s=secone.charAt(i);
				        	int temp=Integer.parseInt(String.valueOf(s));
				        	count+=temp;
				        }
				     if(sum==count){
				    	 sss+=1;
				     }
			       
	                 }
			        System.out.println(sss-1);
	}

}


发表于 2017-09-13 13:06:01 回复(0)

import java.util.Scanner;

public class LucyNumber {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int n = sc.nextInt();
if(n < 1) {
System.out.println(0);
}else {
int[] dp2 = new int[n+1];
int[] dp10 = new int[n+1];
int count = 0;
for(int i = 1; i <= n; i++){
dp2[i] = (i & 1) == 0 ? dp2[i >> 1] : dp2[i >> 1] + 1;
dp10[i] = dp10[i/10] + i%10;
if(dp2[i] == dp10[i]) count++;
}
System.out.println(count);
}
}
}
}

发表于 2017-09-07 10:28:42 回复(1)
分别计算出【1,n】之中个数的十进制数各数字和与二进制数各数字和,然后进行比较即可,其中十进制数的求和可以先转换成字符串,然后使用字符串的相关方法获取每个数进行累加即可
public class Main{
	
	//幸运数
	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int f, g,sum;
		sum = 0;
		for(int i=1; i<=n; i++){
			f = 0;
			g = 0;
			//计算f的值
			String nstr = String.valueOf(i);
			for(int j=0; j<nstr.length(); j++){
				int x = Integer.parseInt(nstr.charAt(j) + "");
				f += x;
			}
			//计算g的值
			int j = i;
			while(j != 0){
				int y = j%2;
				g += y;
				j /= 2;
			}
			
			if(f == g){
				sum++;
			}
		}
		System.out.println(sum);
	}
	
}

发表于 2017-08-31 13:21:26 回复(0)

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
while (scanner.hasNext()) {
int n = scanner.nextInt();
int counter = 0;
for (int i = 1; i <= n; i++) {
int m = i;
int shisum = 0;
do {
int x = m % 10;
shisum += x;
m = (m - x) / 10;
} while (m != 0);
int ersum = 0;
m = i;
do {
ersum += (m % 2);
m = m / 2;
} while (m != 0);
if (ersum == shisum)
counter++;
}
System.out.println(counter);
}
}
}

}

发表于 2017-08-12 21:47:15 回复(0)