CSU Problem 1777 大还是小?——湖南省第十一届大学生计算机程序设计竞赛

来源:互联网 发布:自定义域名 编辑:程序博客网 时间:2024/05/17 17:18

此文章可以使用目录功能哟↑(点击上方[+])

 CSU Problem 1777 大还是小?

Accept: 0    Submit: 0
Time Limit: 1 Sec    Memory Limit : 128 MB

 Problem Description

输入两个实数,判断第一个数大,第二个数大还是一样大。每个数的格式为:

[整数部分].[小数部分]

简单起见,整数部分和小数部分都保证非空,且整数部分不会有前导 0。不过,小数部分的最 后可以有 0,因此 0.0 和 0.000 是一样大的。

 Input

输入包含不超过 20 组数据。每组数据包含一行,有两个实数(格式如前所述)。每个实数都 包含不超过 100 个字符。

 Output

对于每组数据,如果第一个数大,输出"Bigger"。如果第一个数小,输出"Smaller"。如果两个 数相同,输出"Same"。

 Sample Input

1.0 2.0
0.00001 0.00000
0.0 0.000

 Sample Output

Case 1: Smaller
Case 2: Bigger
Case 3: Same

 Hint


 Problem Idea

解题思路:

【题意】
给你两个包含不超过100个字符的实数

要求比较它们的大小关系


【类型】
字符串函数应用(strlen,strcpy,strcmp)

【分析】

首先,此题有个小bug,就是你直接用%lf输入这两个实数,然后直接用'>','<'比较大小也能过此题

即如下这种代码:

int main(){    double a,b;    int p=1;    while(~scanf("%lf%lf",&a,&b))    {        printf("Case %d: ",p++);        if(a>b)            puts("Bigger");        else if(a<b)            puts("Smaller");        else            puts("Same");    }    return 0;}
但显然这种方法是不对的



由此可见,我们已经对此方法举出反例

接着,我们来讲讲正确的做法

先把实数拆成整数部分和小数部分

那么两数比较大小可以先比较整数部分,如果整数部分不一样,显然不需要再比较小数部分

而整数部分的比较,你可以遍历一遍去比较,也可以像本人一样,采用strcmp函数直接比较

若整数部分相等时,才去考虑小数部分的比较

此时,为了便于使用strcmp函数进行小数部分比较,我们需将俩实数的小数部分位数补齐

比如实数0.0123和实数0.0000520

我们则需要补齐成实数0.0123000和实数0.0000520,然后比较

于是,此题得解

【时间复杂度&&优化】
O(n)

题目链接→CSU Problem 1777 大还是小?

 Source Code

/*Sherlock and Watson and Adler*/#pragma comment(linker, "/STACK:1024000000,1024000000")#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<stack>#include<math.h>#include<vector>#include<map>#include<set>#include<bitset>#include<cmath>#include<complex>#include<string>#include<algorithm>#include<iostream>#define eps 1e-9#define LL long long#define PI acos(-1.0)#define bitnum(a) __builtin_popcount(a)using namespace std;const int N = 105;const int M = 100005;const int inf = 1000000007;const int mod = 1000003;char a[N],b[N],c[N],d[N];int main(){    int p=1,i,j,Max;    while(~scanf("%s%s",a,b))    {        Max=max(strlen(a),strlen(b));        for(i=strlen(a);i<Max;i++)            a[i]='0';        for(j=strlen(b);j<Max;j++)            b[j]='0';        a[i]=b[j]='\0';        printf("Case %d: ",p++);        for(i=0;a[i]!='.';i++);        for(j=0;b[j]!='.';j++);        a[i]=b[j]='\0';        strcpy(c,a+i+1);        strcpy(d,b+j+1);        if(strcmp(a,b)>0)            puts("Bigger");        else if(strcmp(a,b)<0)            puts("Smaller");        else        {            if(strcmp(c,d)>0)                puts("Bigger");            else if(strcmp(c,d)<0)                puts("Smaller");            else                puts("Same");        }    }    return 0;}

菜鸟成长记

1 0