奇妙货币交易问题

206 阅读1分钟

问题描述

小R住在一个名为 X 国的国家,这里的货币非常特殊,面值为 V0,V1,V2,...,VnV0,V1,V2,...,Vn,并且 nn 可以无限大。该国的交易规则也很特别:在一次交易中,双方只能对每种面值的货币使用不超过两次。

例如,小R想买一件价格为 198 的物品,货币的基数 V=10V=10 时,小R可以使用 2 张 100(102)100(102) 的纸币,卖家则找回 2 张 1(100)1(100) 的纸币。由于这个奇怪的规则,很多 X 国人都无法快速判断某个物品是否可以用这种方式交易成功,他们常常会请聪明的你来帮助。

你能帮他们判断一下,是否能按照规则用给定的货币面值 VV 来完成价格为 WW 的交易吗?

约束条件:

  • VW为整数,数据范围 2 ≤ V, 1 ≤ W

测试样例

样例1:

输入:V = 10,W = 9
输出:'YES'

样例2:

输入:V = 200,W = 40199
输出:'YES'

样例3:

输入:V = 108,W = 50
输出:'NO'


public class Main {
    public static String solution(int V, int W) {
        // Edit your code here
        if(V>W+2&&W>2){
            return "NO";
        }
        if(W<3){
            return "YES";
        }
        int i=0,tmp;
        while(W>0){
            if(Math.abs(V-W)<3){
                return "YES";
            }
            if(W<3){
                return "YES";
            }
            i=0;
            //先指数逼近
            while(Math.pow(V,i)<W){
                i++;
            }
            i--;

            tmp=(int)Math.pow(V,i);
            if(tmp==W){
                return "YES";
            }
            //再乘法
            W=Math.abs(W-tmp*2);
            if(i==0&&Math.abs(V-W)>2){
                return "NO";
            }
        }
        return "YES";
    }


    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(solution(10, 9) == "YES");
        System.out.println(solution(200, 40199) == "YES");
        System.out.println(solution(108, 50) == "NO");

    }
}