第一章 程序设计入门--算法竞赛入门经典

第一章 程序设计入门–算法竞赛入门经典

知识点一:
int m=25;
printf("%d\n",m);
printf("%03d\n",m);

输出如下:
25
025

知识点二:不借住任何变量,交换a,b两个值

方法1:

#include<stdio.h>
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("%d %d\n", a, b);
	return 0;
}

方法2:

#include<stdio.h>
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	a ^= b ^= a ^= b;
	printf("%d %d\n", a, b);
	return 0;
}

方法3:多数算法竞赛采用黑盒测试,即只考查程序解决问题的能力,而不关心采用了什么方法。对于本题而言,最合适的程序如下:

#include<stdio.h>
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d %d\n", b, a);
	return 0;
}
知识点三:鸡兔同笼

已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出No answer。

//分析:设鸡有a只,兔有b只,则a+b=n,2a+4b=m,
//联立得a=(4n-m)/2,b=n-a
#include<stdio.h>
int main()
{
	int a, b, n, m;
	scanf("%d %d", &n, &m);
	a = (4 * n - m) / 2;
	b = n - a;
	if (m % 2 == 1 || a < 0 || b < 0)
	/*c语言中的逻辑运算符都是短路运算符,一旦能够
	确定整个表达式的值,就不再继续计算。*/
		printf("No answen");
	else
		printf("%d %d\n", a, b);
	return 0;
}
知识点四:

在C99中,double的输出必须用%f,而输入需要用%lf,但是在C89和C++中都不必如此——输入输出可以都用%lf。

知识点五:
判断是否构成三角形,两个小边大于最大边。
知识点六:

判断闰年: if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) printf(“yes\n”);

#include<stdio.h>
int main()
{
	int year;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		printf("yes\n");
	else
		printf("no\n");
	return 0;
}
知识点七:int型整数的最小值和最大值是多少?

分析:int用32位存储,最高位是符合位,剩下的是数值位;
正int的符号位为0,数值位用原码表示,从最小值+1(0x00 0x00 0x00 0x01)到最大值+2^31-1=+2147483647(0x7f 0xff 0xff 0xff);
负int的符号位为1,数值位用补码表示,从最小值-1(0xff 0xff 0xff 0xff 0xff)到最大
值-2^31=-2147483648(0x80 0x00 0x00 0x00),计算机将-0(0x80 0x00 0x00 0x00)定义为负int的最大值,所以负int比正int表示的范围多一个数;
零表示为+0(0x00 0x00 0x00 0x00)。

#include<stdio.h>
int main()
{
	int min;
	int max;
	for (min = -1;min < 0;min--);
	printf("%d\n", min + 1);
	for (max = 1;max > 0;max++);
	printf("%d\n", max - 1);
	return 0;
}

输出:
-2147483648
2147483647

知识点八:

输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)。
代码一:

#include<stdio.h>
#include<math.h>
int main()
{
	for (int a = 1;a <= 9;a++)
	{
		for (int b = 0;b <= 9;b++)
		{
			int n = a * 1100 + b * 11;
			int m = floor(sqrt(n) + 0.5);
			if (m*m == n)
				printf("%d\n", n);
		}
	}
	return 0;
}

代码二:

#include<stdio.h>
int main()
{
	for (int x = 1;;x++)
	{
		int n = x*x;
		if (n < 1000)
			continue;
		if (n > 9999)
			break;
		int hi = n / 100;
		int lo = n % 100;
		if (hi / 10 == hi % 10 && lo / 10 == lo % 10)
			printf("%d\n", n);
	}
	return 0;
}

输出:
7744

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值