比较两个字符串作为数值
Compare two string as numeric value
我应该如何在 C++ 中比较两个表示数字的字符串?我想转换为 long long
类型的数字,但问题是字符串表示的数值可以超过 long long
MAX 限制。
保证字符串代表一个数值。
Javacompare 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 个字符串作为输入,returns 如果第 2 个(在本例中为 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++ 中比较两个表示数字的字符串?我想转换为 long long
类型的数字,但问题是字符串表示的数值可以超过 long long
MAX 限制。
保证字符串代表一个数值。
Javacompare 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 个字符串作为输入,returns 如果第 2 个(在本例中为 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;
}