幸運数かどうかを判断する


1.幸運数の定義:
十進法の数字の各ビット加算とバイナリの数字の各ビットの加算とが等しい場合はバイナリ数であり、そうでない場合はバイナリ数ではなく、0-nの幸運数の個数を出力する.
2.C++実装:
#include <iostream>
using namespace std;
int tenSummary(int x)
{
    int sum=0;
    while (x>=1)
    {
        int mod=x%10;
        x=x/10;
        sum+=mod;
    }
    return sum;
}

int twoSummary(int x)
{
    int icount = 0;
    while (x != 0 )
    {
        icount ++;
        x = x & (x - 1);
    }
    return icount;
}
bool isLucky(int x)
{
    int tenSum=tenSummary(x);
    int twoSum=twoSummary(x);
    if(tenSum==twoSum)
    {
        return true;
    }
    else
    {
        return false;
    }
}
int getNumber(int x)
{
    int number=0;
    for (int i=1;i<=x;i++)
    {
        if (isLucky(i)==true)
        {
            number++;
        }
        else
        {
            continue;
        }
    }
    return number;
}
int main()
{
    int number;
    while(cin>>number)
    {
       cout<<"ten"<<tenSummary(number)<<endl;
       cout<<"two"<<twoSummary(number)<<endl;
       cout<<"number="<<getNumber(number)<<endl;
    }
    return 0;
}

3.python実装
import sys

def tenSummary(x):
    tenSum=0
    while(x!=0):
        mod=x%10
        x=x/10
        tenSum=tenSum+mod
    return int(tenSum)

def twoSummary(x):
    if x >= 0:
        return bin(x).count('1')
    else:
        return bin(x & 0xffffffff).count('1')

def isLucky(x):
    tenSum=tenSummary(x)
    twoSum=twoSummary(x)
    if(tenSum==twoSum):
        return True
    else:
        return False

def getNumber(x):
    number=0
    if(x==0):
        return number
    for r in range(1,x+1):
        if isLucky(r):
            number=number+1
            print(r)
        else:
            continue
    return number

if __name__=='__main__':
    print(getNumber(123))