简单的试炼

【题目描述】

已知一个数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<cstdio>
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的转换皆可通过。
*/
posted @ 2016-06-07 14:23  前前前世。  阅读(202)  评论(0编辑  收藏  举报