比较两个字符串作为数值

Posted

技术标签:

【中文标题】比较两个字符串作为数值【英文标题】:Compare two string as numeric value 【发布时间】:2016-07-23 16:45:27 【问题描述】:

在 C++ 中我应该如何比较两个表示数字的字符串?我想过转换为long long 类型的数字,但问题是字符串表示的数值可能超过long long MAX 限制。 保证字符串代表一个数值。

Java compare two numeric String values 中有一个类似的问题。 但这利用了我们在 C++ 中没有的 BigInteger 库。

【问题讨论】:

@CaffeineToCode 这会将一个很长的数字转换为 int,并丢失数据。 GMP 将让您处理大于long long 的数字。 【参考方案1】:

逐位比较:

a = "3254353245423345432423133423421"
b = "3254353245423345432443133423421"

for(int i = 0; i < a.length(); ++i):
    if ((a[i] - '0') < (b[i] - '0'))
     
        std::cout << "b is larger!" 
    

如果您想知道b 是否大于a,或者它们是否相等,我相信您可以从这里获取。或者,如果它们的长度不同,则较大的获胜! (检查开头是否为零,即"000443342")不要忘记考虑负数。

【讨论】:

@PrashantBhanarkar 请阅读我的最后一行。 “或者,如果它们的长度不同,则较大的获胜!” @BlackMoses,被答案的文字所覆盖。 @BlackMoses 请阅读我的最后一行,看在上帝的份上......”(检查开头的零,即“000443342”)“ 主要问题是负数。 @chris 这个也可以查,不过我不是来做作业的。 (虽然我会将这个想法添加到答案中)【参考方案2】:

如果你想一想,它并不难。为简单起见,我们将假设两个没有前导零的正数。如果它们有前导零,则丢弃它们。

现在考虑两个数字: 123456 23456 很明显,第一个更大,因为它更长。这使我们能够快速解决大多数比较问题。现在,如果它们的长度相等,只需从一开始就比较它们。 smaller 前导数字较小。如果相等,则取下一位。

现在其他情况呢?好吧,一个正数和一个负数很容易,负数较小,周期。如果您有两个负数,那么您必须执行与比较两个正数时相同的操作,但这次 较大 前导数字的数字较小。


正如在 cmets 中向我指出的那样,std::string 已经实现了字典比较,这意味着您只需将字符串清理为有效数字,调用 std::string::compare 并确定 -1 是否意味着更小(正数)或更大(负数)。

【讨论】:

请注意,您在上一段中描述的算法正是比较两个字符串所做的,因此无需重新实现。 @chris True,一旦你丢弃前导零并假设你有std::strings。问题的表述方式让我想起了竞争性的编码问题,出于某种原因,人们倾向于坚持使用 C 和 C++ 编译器(因此是 char*)。我也承认我没有想到这只是一个字典比较。【参考方案3】:

如果您将两个字符串作为整数进行比较, 您可能会发现自己也想做其他数学。

使用GMP 并免去您的麻烦。

#include <iostream>
#include <gmpxx.h>

int main()

    mpz_class x("12323423434534234234234");
    mpz_class y("9994828945090011626439");

    std::cout << std::boolalpha;
    std::cout << (x < y) << '\n';


//example compilation:  g++ mycxxprog.cc -lgmpxx -lgmp

这对于您的特定问题来说可能是多余的,因为它会增加项目的依赖关系。 请务必考虑其他选择。

【讨论】:

【参考方案4】:

将 2 个字符串作为输入,如果 2nd(本例中为 b) 较大则返回 1,否则返回 0。

int find(char a[],char b[])

    int i = 0;
    int flag = 0;
    if(a[0] == '-' && b[0] !='-')
    
        printf("%s is larger: %s is -ve",b,a);
        return 1;
    
    else if(b[0] == '-' && a[0] !='-')
    
        printf("%s is larger: %s is -ve",a,b);
        return 0;
    
    for(i = 0; i < strlen(a); ++i)
    
        if(a[i] == '.' && b[i] != '.')
        
            printf("%s is larger: %s is .",b,a);
            return 1;
        
        else if(b[i] == '.' && a[i] != '.')
        
            printf("%s is larger: %s is .",a,b);
            return 0;
        
        else if(a[i] == '.' && b[i] == '.')
        
            printf("passed\n");
            continue;
        
        if ((a[i] - '0') < (b[i] - '0'))
        
            flag =  1;
            //break;
        
    
    if(flag == 0)
        return 0;
    else
        return 1;

【讨论】:

以上是关于比较两个字符串作为数值的主要内容,如果未能解决你的问题,请参考以下文章

在C中的两个设置位置(整数值)之间比较两个字符串的两个子字符串[关闭]

Java实现比较两个数值数组的大小

Linux Shell数值比较和字符串比较及相关

Linux Shell数值比较和字符串比较及相关

[Python]-5-比较运算

字符串和数值类型比较大小