1. 程式人生 > 實用技巧 >第二章-線上程式設計題2-求解幸運數問題

第二章-線上程式設計題2-求解幸運數問題

問題描述:小明同學在學習了不同的進位制之後用一些數字做起了遊戲。小明同學知道,在日常生活中最常用的是十進位制數,而在計算機中二進位制數也很常用。現在對於一個數字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。小明同學發現對於一些正整數α滿足f(z)=g(z),他把這種數稱為幸運數,現在他想知道,小於等於n的幸運數有多少個?

輸入描述:每組資料輸入一個數n(n<100 000)。

輸出描述:每組資料輸出一行,小於等於n的幸運數個數。

輸入樣例:21

輸出樣例:3

演算法思想:這道題我在剛開始做的時候,設計了兩個遞迴函式來分別求各位數與各二進位制位數。但仔細思考會發現,求解每一個位數和求解每一個二進位制位數,分別是對10取模和對2取模。所以只需要設計一個能取不同模數的遞迴程式即可實現。

程式碼如下:

#include <iostream>
using namespace std;

int n;
int solve(int n, int r)
{
    int res = 0;
    if (n < r)
        return n;
    
return n % r + solve(n / r, r); } int main() { cin >> n; int ans = 0; for (int i = 1; i <= n; i++) if (solve(i, 10) == solve(i, 2)) ans++; cout << ans << endl; return 0; }