codevs 2669 简单的试炼

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\n",i,mi3-1,s);
                 mi3=0;
                 break;
             }
           }
        scanf("%lld",&s);
    }
    return 0;
    
}

 

转载于:https://www.cnblogs.com/xiaoningmeng/p/5567199.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值