2、codevs 2669 简单的试炼
题目描述 Description
已知一个数S,求X和Y,使得2^X+3^Y=S.
输入描述 Input Description
(多组数据)
每行一个整数S,当S=0时输入结束.
输出描述 Output Description
X和Y,以2^X+3^Y=S的形式输出,若有多组解,输出X最小的那组.
样例输入 Sample Input
13
33
0
样例输出 Sample Output
2^2+3^2=13
2^5+3^0=33
数据范围及提示 Data Size & Hint
对于30%的数据 S≤50,000,000 , 数据组数≤5000
对于50%的数据 S≤3,000,000,000 , 数据组数≤20000
对于80%的数据 S≤3,000,000,000,000 , 数据组数≤50000
对于100%的数据 S≤200,000,000,000,000, 数据组数≤80000
#include<cstdio> #include<cmath> long long s; int mi3=0; bool jc(long long x)//判断在此2的i次幂下能否使3的mi3有整数 { mi3++; if (x%3&&x!=1)//不是3的幂 { mi3=0;//清空以便再次计算 return 0; } if (x==1) return 1;//符合方程式 else (jc(x/3)); } long long ksm(int k,long long x)// { for (int i=1;i<=k;i++) x*=2; return x;// } int main() { scanf("%lld",&s); while (s) { int j=ceil(sqrt(s));//如果只用2的幂组成s,2的指数绝对不会超过j //下面的循环不会到j,所以不用担心s-k会小于零 for (int i=0;i<=j;i++) { long long k=ksm(i,1); if (jc(s-k)) //因为题目只要输出最小的x,所以只要有i符合条件,输出后直接跳出即可 { printf("2^%d+3^%d=%lld ",i,mi3-1,s); mi3=0; break; } } scanf("%lld",&s); } return 0; }