PAT 1011 解析

一、题目详情

问题描述:A+B 和 C

给定区间 [-2^{31},2^{31}]内的 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 3

Case #1: false
2 3 4

Case #2: true
2147483647 0 2147483646

Case #3: true
0 -2147483648 -2147483647

Case #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 -2147483647

Case #1: false
Case #2: true
Case #3: true
Case #4: false

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值