一、题目详情
问题描述:A+B 和 C
给定区间 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。
输入格式:
输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出 Case #X: true
如果 A+B>C,否则输出 Case #X: false
,其中 X
是测试用例的编号(从 1 开始)。
输入样例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
输出样例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
二、题目解析
代码:
#include<stdio.h>
int main()
{
/*
* n:输入A、B、C整数序列的次数
* a,b,c:分别存储整数A、B、C
* i:循环变量
*/
int n, i;
long a,b,c;
//通过键盘获取整数序列的次数
scanf("%d", &n);
//逐次判别 A+B>C
for(i=0;i<n;i++)
{
//输入整数A、B、C
scanf("%ld %ld %ld", &a, &b, &c);
if(a+b>c)//A+B>C为真
printf("Case #%d: true\n", i+1);
else//A+B>C为假
printf("Case #%d: false\n", i+1);
}
}
提交结果(分数/满分):
15/15
提示:
1. 整型变量表达的范围
在 PAT 平台上,变量 a、b、c 被声明为 long 型,以满足题设要求,代码为:
long a,b,c;
......
scanf("%ld %ld %ld", &a, &b, &c);
若将变量 a、b、c 被声明为 int 型,则测试点 1 和 2 的结果显示有误,相应代码为:
int a,b,c;
......
scanf("%d %d %d", &a, &b, &c);
这显然与编译器有关。若采用 Visual C++ 6.0,将变量 a、b、c 被声明为 int 型是可行的,仍旧可以得到预期的运行结果。对于 Visual C++ 6.0,整型变量占 4 个字节(见下述代码),满足题设要求。
#include <stdio.h>
int main()
{
printf("%d", sizeof(int));
return 0;
}
输出结果为:
4
2. 数据输入与输出
1) 本例的做法:每输入一组数据,就判别 A+B>C,即输入一行输出一行,输入一行输出一行。若在 Visual C++ 6.0 下运行本例代码,终端上是这样的:
4
1 2 3Case #1: false
2 3 4Case #2: true
2147483647 0 2147483646Case #3: true
0 -2147483648 -2147483647Case #4: false
2) 另外的做法:将全部数据一次性输入完成后,再逐行处理,判别 A+B>C,这就需要利用动态数组加以实现,代码如下:
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct Data)
int main()
{
/*
* n:需要移动的正整数的个数,1<=n<=100
* m:右移的次数,m>0
* sturct Data:用于存储一系列整数的结构体类型(动态链表节点)
** int number[3]:结构体变量,用于存储A、B、C三个整数
** struct Data *next:结构体成员变量,用于链接结构体变量
* struct Data *head, *p1, *p2:用于创建动态链表时所需的结构体指针
* temp:用于交换结构体成员变量x的临时变量
* x:通过键盘输入的整数序列中的整数,与结构体变量x相呼应
* i:循环变量
*/
long x1, x2, x3;//这里声明为long型,原因已在上文解释
int n, i;
struct Data
{
long number[3];//这里声明为long型,原因已在上文解释
struct Data *next;
};
struct Data *head, *p1, *p2;
head = p1 = p2 = NULL;
//获取A、B、C的组数
scanf("%d", &n);
//通过创建动态链表,构建n组A、B、C的数字序列
for(i=0;i<n;i++)
{
p1 = (struct Data *)malloc(LEN);
scanf("%ld %ld %ld", &x1, &x2, &x3);
p1->number[0] = x1;
p1->number[1] = x2;
p1->number[2] = x3;
if(i == 0)
head = p1;
else
p2->next = p1;
p2 = p1;
}
p2->next = NULL;
//逐组判别 A+B>C
if(head)
{
p1 = head;
for(i=0;i<n;i++)
{
if((p1->number[0] + p1->number[1]) > p1->number[2])
printf("Case #%d: true\n", i+1);
else
printf("Case #%d: false\n", i+1);
p1 = p1->next;
}
}
return 0;
}
在 Visual C++ 6.0 下运行本例代码,终端上就变为这样的:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647Case #1: false
Case #2: true
Case #3: true
Case #4: false