繁体   English   中英

比较两个字符串作为数值

[英]Compare two string as numeric value

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

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

逐位比较它们:

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" )不要忘记考虑负数。

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

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

那么其他情况呢? 嗯,一个正数和一个负数很容易,负数更小,句号。 如果你有两个负数,那么你必须像比较两个正数一样做同样的事情,但这次前导数字较大的数字较小。


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

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

使用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

对于您的特定问题,这可能是矫枉过正,因为它增加了项目依赖性。
请务必考虑其他选项。

将 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM