例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;
}