codeforces Educational Codeforces Round 5 A. Comparing Two Long Integers

题目链接:http://codeforces.com/problemset/problem/616/A

题目意思:顾名思义,就是比较两个长度不超过 1e6 的字符串的大小

模拟即可。提供两个版本,数组版本 & 指针版本。

  (1)数组版本(短的字符串从高位处补0,直到跟长的字符串长度相同)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 1e6 + 5;
 8 char a[maxn], b[maxn];
 9 int rev_a[maxn], rev_b[maxn];
10 
11 int cmp(int len)
12 {
13     int f = 0;   // 0: a=b;  1: a>b;  2: a<b
14     // 比较的时候要从高位比起,存储的时候是从低位开始存的
15     for (int i = len-1; i >= 0 && !f; i--) {
16         if (rev_a[i] > rev_b[i]) {
17             f = 1;
18         }
19         else if (rev_a[i] < rev_b[i]) {
20             f = 2;
21         }
22     }
23     return f;
24 }
25 
26 int main()
27 {
28     #ifndef ONLINE_JUDGE
29         freopen("in.txt", "r", stdin);
30     #endif // ONLINE_JUDGE
31 
32     while (scanf("%s%s", a, b) != EOF) {
33         int la = strlen(a);
34         int lb = strlen(b);
35 
36         for (int i = 0; i < la; i++) {
37             rev_a[la-i-1] = a[i]-'0';
38         }
39 
40         for (int i = 0; i < lb; i++) {
41             rev_b[lb-i-1] = b[i]-'0';
42         }
43 
44         int flag = 0;
45         // 保证比较的字符串长度相等, 0补上
46         if (la < lb) {    // la < lb
47             for (int i = 0; i < lb-la; i++) {
48                 rev_a[la+i] = 0;
49             }
50             flag = cmp(lb);
51         }
52         else {            // la >= lb
53             for (int i = 0; i < la-lb; i++) {
54                 rev_b[lb+i] = 0;
55             }
56             flag = cmp(la);
57         }
58         if (flag == 1) puts(">");
59         else if (flag == 2) puts("<");
60         else puts("=");
61     }
62     return 0;
63 }

 

  (2)指针版本(过滤前缀0之后,再逐位比较大小)

 1 /*
 2     指针版本
 3 */
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <cstring>
 8 using namespace std;
 9 
10 const int maxn = 1e6 + 5;
11 char a[maxn], b[maxn];
12 
13 int cmp(char *s1, char *s2)
14 {
15     // 过滤前缀 0
16     while (*s1 == '0') {
17         s1++;
18     }
19     while (*s2 == '0') {
20         s2++;
21     }
22 
23     int l1 = strlen(s1);
24     int l2 = strlen(s2);
25     if (l1 > l2) {
26         return '>';
27     }
28     else if (l1 < l2) {
29         return '<';
30     }
31     // a,b长度相等(l1 = l2)
32     for (int i = 0; i < l1; i++) {
33         if (*s1 < *s2) {     // 指针指向的值
34             return '<';
35         }
36         else if (*s1 > *s2) {
37             return '>';
38         }
39         s1++;    // 指针右移一位
40         s2++;
41     }
42     return '=';
43 }
44 
45 
46 int main()
47 {
48     #ifndef ONLINE_JUDGE
49         freopen("in.txt", "r", stdin);
50     #endif // ONLINE_JUDGE
51 
52     while (scanf("%s%s", a, b) != EOF) {
53         printf("%c\n", cmp(a, b));
54     }
55     return 0;
56 }

 

转载于:https://www.cnblogs.com/windysai/p/5137370.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值