高精度数据之间如何比较大小?例题来自:P1781 宇宙总统

 题目描述

地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 $n$ 个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

 输入格式

第一行为一个整数 n,代表竞选总统的人数。

接下来有 n 行,分别为第一个候选人到第 n 个候选人的票数。

输出格式

共两行,第一行是一个整数 m,为当上总统的人的号数。

第二行是当上总统的人的选票。

 样例 

 样例输入 
5
98765
12365
87954
1022356
985678

样例输出 
4
1022356

提示

票数可能会很大,可能会到 100位数字。

为何不能直接比较大小?

高精度数据不能直接比较大小的原因主要与浮点数的精度和舍入误差有关。在计算机中,浮点数是以二进制形式存储的,并且采用了一定的位数来表示小数部分。然而,由于二进制表示的有限性,浮点数在进行计算和存储时可能会存在舍入误差。这意味着,两个看似相等的浮点数在计算机内部的表示可能会有细微的差异。

所以我们得另辟蹊径,使用字符串来模拟数据来比较大小。使用字符串来模拟数据并比较大小,通常是处理超出常规数据类型所能表示范围的大数值的一种有效方法。以下是一个用 C++ 实现的比较两个字符串表示的数值大小的函数示例:

#include <iostream>
#include <string>
using namespace std;

// 比较两个字符串表示的数值大小
bool stringNumberCompare(const string& num1, const string& num2) {
    // 如果长度不同,长度长的数值大
    if (num1.length()!= num2.length()) {
        return num1.length() > num2.length();
    }

    // 长度相同,从高位到低位逐位比较
    for (size_t i = 0; i < num1.length(); ++i) {
        if (num1[i]!= num2[i]) {
            return num1[i] > num2[i];
        }
    }

    // 两个数值相等
    return false;
}

int main() {
    string num1 = "12345678901234567890";
    string num2 = "12345678901234567891";

    if (stringNumberCompare(num1, num2)) {
        cout << num1 << " 大于 " << num2 << endl;
    } else {
        cout << num1 << " 小于或等于 " << num2 << endl;
    }

    return 0;
}

例如,对于很大的数值“12345678901234567890”和“12345678901234567891”,通过上述函数可以正确比较出它们的大小。这种方法的优点是可以处理任意长度的数值,只要内存允许存储相应的字符串。但缺点是比较过程相对较慢,因为需要逐个字符进行比较。

字符串的比较原理:

比较两个字符串时,通常会逐个比较它们的字符编码值。比较过程从字符串的开头开始,依次比较每个字符的编码值。如果在比较过程中找到不相等的字符,比较就会结束,并返回相应的结果。

如果两个字符串的所有字符编码值都相等,并且它们的长度也相同,那么这两个字符串就被认为是相等的。否则,根据比较的结果,字符串的大小关系可以确定。

搞清楚这些之后,原题就不难解决了,我们通过打擂台的方法,谁打赢留下,输了退场,即大的保留,小的数被大的数替代。二者的比较方法就是先比较二者的长度,长度长的实际数值必然大。如果长度相同,那么就用符号“>"来判断,他就会依次比较每一位的大小,一比较出结果马上结束。所以代码也就很简单的实现了:

#include<iostream>
using namespace std;
int main() {
	int n, Max = 0;
	string num,max="0";//注意这里赋值max为”0“。
	cin >> n;
	for (int i = 1; i <= n; i++) {//打擂台法
		cin >> num;
		if (num.length() > max.length()) {//单纯数字组成的字符串,当然长度更长其实际数值更大
			Max = i;//打赢保留,即大的留下。
			max = num;
		}
		else if (num.length() == max.length()) {//如果长度相同,就进行依次比较哦
			if (num > max) {
				Max = i;//依然是打赢留下。
				max = num;
			}
		}//想想为什么不需要考虑(num.length()<max.length())
	}
	cout << Max << endl << max;//输出打赢留下的即可
	return 0;
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值