Java/1025. Divisor Game 除数博弈(为什么要这样解)

60 篇文章 0 订阅

先上题目


 

 

 

 

 

讲一下思路吧:哪个数选不出小于自己可以整除正除数了?是不是只有“1”,所以其实就是谁拿到“1”谁输的游戏,所以判断能不能拿到“1”很重要。先手情况下,拿去比N小,且被N整除的正整数。当N为奇数时,我 只能拿掉奇数(奇数不能整除偶数,双方都不会出错情况下),所以比自己小的奇数时多少?最佳情况下对手不可能给你拿到偶数,所以你永远只能拿奇数,知到对方拿到“2”,你就遇到“1”了。当N为偶数时,我是不是可以拿掉一个奇数(1)或偶数,剩下“1”给对手。(或者找结果规律)

 

代码部分(0ms 100%)

class Solution {
    public boolean divisorGame(int N) {
        return N % 2 == 0;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码在进行除法计算时有一些问题: 1. 当被除数小于除数时,应该返回0而不是空字符串。 2. 在计算商和余数时,将余数从被除数中取出时,应该取出 divisor.s.length() 个数字而不是 divisor.s.length() - 1 个数字。 3. 在计算商和余数时,循环条件应该是 i <= dividend.s.length() 而不是 i < dividend.s.length()。 4. 在计算商和余数时,应该在每次将商加1时,判断商是否大于等于10的当前进制次幂,如果是,需要将商的进制位数增加1。 5. 在计算商和余数时,应该在最后将商和余数都移除前导0。 6. 在更新商和余数的符号时,应该将商的符号设置为 sign1 * a.sign,而不是只设置为 sign1。 下面是修改后的代码: ``` VeryLongInt operator/ (const VeryLongInt& a, const VeryLongInt& b) { // 判断被除数除数的符号 int sign1 = 1; if (a.sign * b.sign < 0) { sign1 = -1; } // 取绝对值进行计算 string num1 = a.s; string num2 = b.s; if (a.sign == -1) { num1 = num1.erase(0, 1); } if (b.sign == -1) { num2 = num2.erase(0, 1); } VeryLongInt dividend = num1; VeryLongInt divisor = num2; // 特殊情况:除数为0,抛出异常 if (num2 == "0") { throw invalid_argument("division by zero"); } // 如果被除数小于除数,商为0,余数为被除数 if (num2 > num1) { return VeryLongInt(0); } // 计算商和余数 VeryLongInt quotient, remainder; int base = a.base; quotient.base = base; remainder.base = base; quotient.sign = sign1; remainder.sign = a.sign; remainder.s = dividend.s.substr(0, divisor.s.length()); for (int i = divisor.s.length(); i <= dividend.s.length(); i++) { remainder.stripZeros(); // 移除余数的前导0 VeryLongInt temp; while (temp <= remainder) { temp += divisor; quotient += VeryLongInt(1); if (quotient.s.length() > 1 && quotient.s[quotient.s.length() - 2] >= base) { quotient.s[quotient.s.length() - 2] -= base; quotient.s[quotient.s.length() - 1] += 1; } } quotient -= VeryLongInt(1); // 减掉多加的1 remainder = remainder - (temp - divisor); if (i < dividend.s.length()) { remainder.s += dividend.s[i]; } } // 更新商和余数的符号 quotient.sign = sign1 * a.sign; remainder.sign = a.sign; quotient.removeLeadingZeros(); remainder.removeLeadingZeros(); return quotient; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值