测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A19849. 好数

填空题 容易

题目描述

好数

题目描述

小明特别喜欢数字3,他认为如果一个正整数等于3的若干个整数次幂相加,并且这些整数次幂均不重复出现,这样的数是“好数”。例如:

1是好数,1=3^0

4是好数,4=3^1+3^0

12是好数,12=3^2+3^1

2不是好数,2=3^0+3^0,3^0出现了2次

15不是好数,15=3^2+3^1+3^1,3^1出现了2次

20不是好数,20=3^2+3^2+3^0+3^0,3^2和3^0各出现2次

虽然15和20还有其他3整数次幂写法,比如15=3^1+3^1+3^1+3^1+3^1,但仍不满足好数定义。

现在输入一个正整数n,输出不小于n的所有好数中最小的一个。

输入格式

仅一行,正整数n。(1<=n<=10^5)。

输出格式

一个正整数,表示不小于n的所有好数中最小的一个。

输入样例1

14

输出样例1

27

输入样例2

13

输出样例2

13

输入样例3

100000

输出样例3

177147

提示

样例1说明:14至26之间的整数都不是好数,因此不小于14的好数中最小的是27;

样例2说明:13=3^2+3^1+3^0,因此不小于13的好数中最小的就是13;

样例3说明:177147=3^11。


参考答案

参考1: #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int main(int argc, char *argv[]) { long long n,m=1,ans=0; scanf("%lld",&n); while(ans<n){//升幂累加 ans+=m; m*=3; } while(m){//降幂试减 if(ans-m>=n) ans-=m; m/=3; } printf("%d\n",ans); return 0; } 参考2: #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int main(int argc, char *argv[]) { long long n,i; scanf("%lld",&n); while(1){ bool b=true; i=n; while(i){ if(i%3==2) {b=false;break;} i=i/3; } if(b) break; else n++; } printf("%d\n",n); return 0; }
上一题 下一题