列表

详情


JD9. 幸运数

描述

小明同学学习了不同的进制之后,拿起了一些数字做起了游戏。小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中,二进制数也很常用。现在对于一个数字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

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2017-11-16

#include <stdio.h>
 
int f(int i)
{
    int sum = 0;
    while(i)
    {
        sum += i % 10;
        i /= 10;
    }
    return sum;
}
 
int g(int x)
{
    int result=0;
    while(x){
        result++;     
        x &= (x - 1);
    }
    return result;
}
 
int main(void)
{
    int num = 0, sum = 0, i;
    scanf("%d", &num);
    for (i = 1; i <= num; i++)
    {
        if (f(i) == g(i))
            sum++;
    }
    printf("%d\n", sum);
 
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-10-04

#include <stdio.h>

int f(int i)
{
	int sum = 0;
	while(i)
	{
		sum += i % 10;
		i /= 10;
	}
	return sum;
}

int g(int x)
{
    int result=0;
    while(x){
        result++;      
        x &= (x - 1);
    }
    return result;
}

int main(void)
{
	int num = 0, sum = 0, i;
	scanf("%d", &num);
	for (i = 1; i <= num; i++)
	{
		if (f(i) == g(i))
			sum++;
	}
	printf("%d\n", sum);

	return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-12

#include <iostream>
#include <string>
#include <algorithm>
#include<functional>
#include <vector>
#include <deque>
#include <sstream>
#include <cctype>
#include <map>
#include <set>
using namespace std;
 
int f(int a)
{
    int sum = 0;
    while (a)
    {
        sum = sum + a % 10;
        a = a / 10;
    }
    return sum;
}
int g(int a)
{
    int count = 0;
    while (a)
    {
        a &= (a-1);
        count++;
    }
    return count;
}
 
int main()
{
    int num;
    while (scanf("%d",&num) != EOF)
    {
        int luck_num = 0;
        while (num)
        {
            if (f(num) == g(num))
                luck_num++;
            num--;
        }
        cout << luck_num << endl;
    }
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-08

#include<iostream>
using namespace std;

int main()
{
	int num;
	cin >> num;

	int n = 0;
	for (int i = 1; i <= num; i++)
	{
		int f = 0, g = 0;
		int m1 = i;
		int m2 = i;
		while (m1)
		{
			f += m1 % 10;
			m1 = m1 / 10;
		}
		while (m2)
		{
			g++;
			m2 = (m2 - 1) & m2;
		}
		if (g == f)
			n++;
	}
	cout << n << endl;
	return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-08

//// HuaWeiOJ.cpp : 定义控制台应用程序的入口点。


#include <iostream>
#include <string>
#include <algorithm>
#include<functional>
#include <vector>
#include <deque>
#include <sstream>
#include <cctype>
#include <map>
#include <set>
using namespace std;

int f(int a)
{
	int sum = 0;
	while (a)
	{
		sum = sum + a % 10;
		a = a / 10;
	}
	return sum;
}
int g(int a)
{
	int count = 0;
	while (a)
	{
		a &= (a-1);
		count++;
	}
	return count;
}

int main()
{
	int num;
	while (scanf("%d",&num) != EOF)
	{
		int luck_num = 0;
		for (int i = 1; i <= num;i++)
		{
			if (f(i) == g(i))
				luck_num++;
		}
		cout << luck_num << endl;
	}
	return 0;
}

上一题