第一章 程序设计入门–算法竞赛入门经典
知识点一:
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