C語言程序設計100例之(59):幸運數字


例59  幸運數字

問題描述

我們認為只包含5和9的數字為幸運數字,比如5, 9, 55, 59, 95... 現在對於給定的N,請你求出從小到大排列后的第N個幸運數字。

輸入格式

輸入包括多行,每行包含一個整數N(0<N<=4611686018427387904)。

輸出格式

對於輸入的每個整數N,輸出一行,包含一個整數,表示第N個幸運數字。

樣例輸入

1

6

100

樣例輸出

5

99

955959

        (1)編程思路。

        由於幸運數字只包含5和9兩個數字,這樣我們可以類似地將其看成是二進制數,只有5和9兩個數碼。但又和二進制略有區別。因為若第1個數0看成5,第2個數1看成9,則第3個數10會看成是95,而不是實際的55。

        為此,借用十進制數轉換為二進制的思想,不斷將n除以2記下余數。具體操作時,若余數為0,則記為2,每次記下余數后,從n中減去余數再除以2,直到n為0。將記下的余數逆序輸出(輸出時1輸出為5,2輸出為9)即可。

(2)源程序。

#include <stdio.h>

int main ()

{

    int a[3]={0,5,9};

    int ans[65];

    long long k;

    while(scanf("%lld",&k)!=EOF)

    {

        int len=0;

        while(k)

        {

            int t=k%2;

            if (t==0) t=2;

            ans[++len]=a[t];

            k=(k-t)/2;

        }

        int i;

        for (i=len;i>=1;i--)

               printf("%d",ans[i]);

        printf("\n");

    }

    return 0;

}

習題59

59-1  數字147

問題描述

由1、4、7數字組成的數從小到大構成的序列為1、4、7、11、14、17、41、44、47…。

對於給定的N,輸出第N小的由1、4、7數字組成的數。

輸入格式

輸入包括多行,每行包含一個整數N(0<N<=4611686018427387904)。

輸出格式

對於輸入的每個整數N,輸出一行,包含一個整數,表示第N小的由1、4、7數字組成的數。

樣例輸入

1

6

100

樣例輸出

1

17

7171

        (1)編程思路。

         仿例59的思路,類似看成3進制即可。

       (2)源程序。

#include <stdio.h>

int main ()

{

    int a[5]={0,1,4,7};

    int ans[31];

    int k;

    while(scanf("%d",&k)!=EOF)

    {

        int len=0;

        while(k)

        {

            int t=k%3;

            if (t==0) t=3;

            ans[++len]=a[t];

            k=(k-t)/3;

        }

        int i;

        for (i=len;i>=1;i--)

            printf("%d",ans[i]);

        printf("\n");

    }

    return 0;

}

59-2  與7無關的數

問題描述

一個正整數,如果它能被7整除,或者它的十進制表示法中某一位上的數字為7,則稱其為與7相關的數。現求所有小於等於n(n < 100)的與7無關的正整數的平方和。

輸入

輸入為一行,正整數n(n < 100)。

輸出

輸出一行,包含一個整數,即小於等於n的所有與7無關的正整數的平方和。

輸入樣例

21

輸出樣例

2336

       (1)編程思路。

        簡單的循環處理。

       (2)源程序。

#include <stdio.h>

int main()

{

    int n,i,sum=0;

    scanf("%d",&n);

    for (i=1;i<=n;i++)

    {

        if (i%7==0 || i/10==7 || i%10==7)

            continue;

        sum+=i*i;

    }

    printf("%d\n",sum);

    return 0;

}

59-3  失蹤的7

問題描述

遠古的Pascal人也使用阿拉伯數字來進行計數,但是他們又不喜歡使用7,因為他們認為7是一個不吉祥的數字,所以Pascal數字8其實表示的是自然數中的7,18表示的是自然數中的16。下面計算一下,在正整數n范圍以內包含有多少個Pascal數字。

輸入

第一行為正整數t,接下來t行,每行一個正整數n(≤2^32-1)。

輸入的是Pascal數字

輸出

對於每個正整數n,輸出n以內的Pascal數的個數。

輸入樣例

2

10

20

輸出樣例

9

18

        (1)編程思路。

        因為Pascal數字中沒有數字7,可以將Pascal數字看成是9進制數,因此本題可將其轉換為輸入的9進制數轉換為10進制數。

       (2)源程序。

#include<stdio.h>

int main()

{

    int t;

    scanf("%d",&t);

    while (t--)

    {

       long long n;

       scanf("%lld",&n);

       long long ans=0,p=1;

       while (n!=0)

       {

           long long x=n%10;

           if (x>=7) x--;

           ans=ans+x*p;

           p=p*9;

           n=n/10;

       }

       printf("%lld\n",ans);

    }

    return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM