博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单的试炼
阅读量:5364 次
发布时间:2019-06-15

本文共 1357 字,大约阅读时间需要 4 分钟。

【题目描述】

已知一个数S,求X和Y,使得2^X+3^Y=S。

【输入描述】

输入多组数据,每行一个整数S,当S=0时输入结束。

【输出描述】

X和Y,以2^X+3^Y=S的形式输出。若有多组解,输出X最小的那组。

【样例输入】

13

33

0

【样例输出】

2^2+3^2=13

2^5+3^0=33

【数据范围及提示】

对于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
double n;long long s;int num;bool Exam(long long t,int &num) //递归判断2^N。{ if (t%2) return false; if (t==2) return true; num++; bool k; k=Exam(t/2,num); return k;}void Solve(){ int ans1(0),ans2(0); for (int a=30;a>=0;a--) //枚举,3^30>200000000000000。 { int k=a; long long number=1,x=3; while (k) //快速幂。 { if (k&1) number*=x; x*=x; k=k>>1; } num=1; if (s-number>0&&(s-number==1||Exam(s-number,num))) { ans1=a; ans2=num; break; //找到答案立即停止循环。 } } n=s; //如此之恶心,实为罕见。 printf("2^%d+3^%d=%.0lf\n",ans2,ans1,n); //尼玛真恶心。}int main() //类型转换好恶心啊!{ scanf("%lf",&n); s=n; printf("%lld",s); while (s) { Solve(); scanf("%lf",&n); s=n; } return 0;} /*   Windows系统下应使用"%I64d"输出Long Long类型,Linux等考试评测环境应使用"%lld",本题中进行Long Long与double的转换皆可通过。 */

转载于:https://www.cnblogs.com/Ackermann/p/5566836.html

你可能感兴趣的文章
Linux常用命令(八)
查看>>
Linux常用命令(七)
查看>>
Linux常用命令(九)
查看>>
Linux常用命令(十一)
查看>>
Linux常用命令(十)
查看>>
实验吧之这就是一个坑
查看>>
Linux常用命令(十二)
查看>>
Linux常用命令(十五)
查看>>
Linux常用命令(十四)
查看>>
Linux常用命令(十七)
查看>>
Linux常用命令(十六)
查看>>
Linux常用命令(二十四)
查看>>
4种java定时器
查看>>
Vue.js 教程
查看>>
linux 设置网卡
查看>>
hive 语法 case when 语法
查看>>
Ajax:js读取txt内容(json格式内容)
查看>>
Task 7 买书最低价格问题
查看>>
Selenium3+python自动化007-警告框
查看>>
html5 相同形状的图形进行循环
查看>>