【问题标题】:16-digit number manipulation on a 32-bit programming language32 位编程语言上的 16 位数字操作
【发布时间】:2020-09-12 16:33:43
【问题描述】:

我有一个简单的问题,但是因为我使用的这种“编程语言”是 32 位的,并且只支持加法、减法、乘法、除法和连接等基本功能(字面意思就是这样),所以我有一些麻烦。

对于输入,我有一个 16 位数字,如下所示:3334,5678,9523,4567

然后我想从这个数字中减去另外 2 个随机的 16 位数字,并检查第一个和最后一个数字是否为 1。

例如,如果另外两个数字是 1111,1111,1111,1111 和 1234,5678,9123,4565。 我的最终号码是:0988,8888,9288,8891。

这里最后一个数字是1,但第一个数字是0,所以测试会失败。

问题在于 32 位系统,由于位提供的精度不够,存在大量错误。有什么方法可以绕过这个问题?

【问题讨论】:

    标签: 32-bit serial-number


    【解决方案1】:

    如果您使用的是 C 或 Java 之类的语言,您应该能够使用 long 创建一个 64 位整数。如果这不可能,您可以将这些数字分成两个 32 位数字,一个用于保存上半部分,一个用于保存下半部分。

    类似这样的:

    //Each half is 8 digits to represent 8 of the 16
    //Because of this each half should be less than 100000000
    int upperHalf = 33345678;
    int lowerHalf = 95234567;
    
    //randomInt represents a function to generate a random
    //integer equal to or greater than 0 and less than the
    //argument passed to it
    int randUpperHalf = randomInt(100000000);
    int randLowerHalf = randomInt(100000000);
    
    int lowerHalf = lowerHalf - randLowerHalf;
    
    //If lowerHalf was a negative number you need to borrow from the upperHalf
    if (lowerHalf < 0) {
        upperHalf = upperHalf - 1;
        lowerHalf = lowerHalf + 100000000;
    }
    
    upperHalf = upperHalf - randUpperHalf;
    
    //Check that the first and last digits are 1
    if ((upperHalf / 100000000) == 1 && (lowerHalf % 10) == 1) {
        //The first and last digits are 1
    }
    

    编辑:已添加注释以更好地解释代码。 (lowerHalf % 2) == 1 已更改为 (lowerHalf % 10) == 1,现在应该能够判断数字是否以 1 结尾。

    【讨论】:

    • 这不起作用。而 (lowerHalf %2) 只显示数字是奇数,不以 1 结尾。
    猜你喜欢
    • 2011-07-17
    • 2012-01-11
    • 1970-01-01
    • 2023-01-25
    • 2013-10-31
    • 2015-09-26
    • 1970-01-01
    • 2013-05-07
    • 2012-09-11
    相关资源
    最近更新 更多