如何检查一个数字的每个数字是不是大于或等于另一个数字?

Posted

技术标签:

【中文标题】如何检查一个数字的每个数字是不是大于或等于另一个数字?【英文标题】:How to check every digit of a number is greater or equal than another number?如何检查一个数字的每个数字是否大于或等于另一个数字? 【发布时间】:2018-06-14 06:38:05 【问题描述】:

每个数字都应该大于或等于另一个数字。如果所有数字都相等,则返回false。

例子:

201 >= 200 true
200 >= 200 false
200 >= 101 false
210 >= 201 false

普通的方式是不断除以10,然后比较余数。

这是Java代码:

private boolean isScoreBetter(final int score, final int scoreToCompare) 
    int a = score;
    int b = scoreToCompare;
    int betterCount = 0;
    while (a > 0 && b > 0) 
        int temp = a % 10 - b % 10;
        if (temp < 0) 
            return false;
        
        if (temp > 0) 
            betterCount++;
        
        a /= 10;
        b /= 10;
    
    return betterCount > 0 && a >= b;

有没有更好的方法? “更好”的定义:

    代码需要简短而优雅 该算法基于数字计算更好,不包含int -> string等类型转换。

两个数的约束:

    它们是非负数 位数不一定相同

感谢您的回复。

【问题讨论】:

对于单个数字,词法和数字比较是相同的,你可以all(a &gt;= b for a, b in zip(str(n1), str(n2))) 你如何协调210 &gt;= 201 false210 &lt; 201 false @ReblochonMasque 这是partial order。 你如何定义“更好”?你的意思是更快、更少的代码、更少的内存,还是别的什么? @ChatterOne 嗨 Chatter,“更好”的定义是更新 :) 【参考方案1】:
str1 = '000'
str2 = '111'

all(a >= b for a, b in zip(str1, str2))
# False

all(a >= b for a, b in zip(str2, str1))
# True

【讨论】:

【参考方案2】:

如果您不想将数字转换为字符串(正如您在编辑中所说的那样),还有不止一种方法可以做到这一点。

你可以编写一个迭代器来给你下一个数字:

def next_digit(number):
    while (number > 1):
        yield number % 10
        number = number // 10

然后您可以map 覆盖所有值并使用all 就像在另一个答案中一样:

    a = 201
    b = 200

    res = all(map(lambda d: d[0] >= d[1], zip(next_digit(a), next_digit(b))))
    print(res) # True

或者你可以使用filter,看看有没有不满足条件的数字:

    res = filter(lambda d: d[0] < d[1], zip(next_digit(a), next_digit(b)))
    print(res) # []

但是,如果您的数字包含大量数字,这些方法可能效率低下,因为它们无论如何都会遍历所有数字。

您可以编写一个推出的 for 循环并通过在与您的条件不匹配的第一个数字处中断它来进行一些优化。

您也可以使用迭代器来做到这一点:

def next_two_digits(a, b):
    while (a > 1 and b > 1):
        yield (a % 10, b % 10)
        a = a // 10
        b = b // 10

你也可以像上一个一样使用它:

res = all(map(lambda d: d[0] >= d[1], next_two_digits(a, b)))
print(res) # True

res = filter(lambda d: d[0] < d[1], next_two_digits(a, b))
print(res) # []

或者你可以做展开循环的事情:

matching = True
for d in next_two_digits(a, b):
    if (d[0] < d[1]):
        matching = False
        break
print(matching)

请记住,这里有一个限制,即两个数字需要具有相同的位数。

【讨论】:

以上是关于如何检查一个数字的每个数字是不是大于或等于另一个数字?的主要内容,如果未能解决你的问题,请参考以下文章

检查数组是不是有大于指定的数字

如何比较纯数字数列中的数字大于某一个数.python?

如何使用 POSTMAN 测试某物是不是大于某个数字

如何在 switch 语句中使用大于或等于

猜数字(模拟)

excel中怎么把一列的数值变成两列?