第一章——程序入门
1.在算法竞赛中不要使用头文件 conio.h,包括getch()、clrscr()等函数
2.尽量用const关键字声明常数
3.KISS——keep It Simple and Stupid.算法竞赛是在比谁能更好的解决问题,而不是在比谁写的程序看上去更高级,应该尽量保持简单,而不是创造条件为了展示自己的编程技巧。
4.C语言中的逻辑运算符都是短路运算符。一旦能够确定整个表达式的值,就不再继续进行计算。
5.适当在程序中编写注释不仅能让其他用户更快地搞懂你的程序,还能帮你自己理清思路。
6.当调用正余弦函数的时候要注意,要对输入的数据进行处理,n*pi/180。
第二章——循环结构程序设计
1.分析所给问题→伪代码→程序。改写伪代码的时候一般先选择较容易的部分。
2.当需要统计某种事物的个数时,可以用一个变量来充当计数器。
3.在观察无法找出错误的时候,可以用“输出中间结果”的方法差错。
4.可以包含time.h头文件,并使用printf("Time used =%f\n",(double)clock() / CLOCKS_PER_SEC)来计时。
在程序结束前调用此函数可以获得整个程序的运行时间。不要直接使用clock()的返回值,而应除以 CLOCKS_PER_SEC。
5.在比赛之前了解文件读写的相关规定,标准输入输出(也称标准I/O,即直接读键盘、写屏幕),还是文件输入输出?如果是文件输入输出,是否禁止用重定向方式访问文件?
6.详细阅读比赛规定,并严格遵守。不要弄错大小写,不要拼写错文件名,不要使用绝对路径或相对路径。
7.注释的好处是,一旦需要时,把注释符去掉即可。
8.在算法竞赛中,有经验的选手往往会使用条件编译指令并且将重要的测试语句注释掉而非删除。
9.条件编译:对其中一部分内容只有在条件满足时才进行编译,也就是对一部分内容制定编译条件。
10.在算法竞赛中,如果不允许使用重定向方式读写数据,应使用fopen和fscanf/fprintf进行输入输出。
11.在多组数据的题目中,一个常见的错误是:在计算完一组数据后某些变量没有重置,影响到吓阻数据的求解。
12.当嵌套的两个代码块中有同名变量时,内层的变量会屏蔽外层变量,有事会引起十分隐蔽的错误。
13.用编译选项-WALL编译程序时,会给出很多(但不是所有)警告信息,以帮助程序员改正错误。但有些是合法的。
——————————————————————————————————————分割线—————————————————————————————————
韩信点兵(hanxin):韩信才智过人,从不直接清点自己军队的人数,只要让士兵以三人一排、五人一排、七人一排地变换队形,而他每次只要掠一眼队伍的排尾就知道总人数了。输入包括多组数据,每组数据包含三个非负整数a,b,c,表示每种队形的排尾人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。一直总人数不小于10,不超过100.输入到文件结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2:No answer
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ans;
int a,b,c;
int kcase=0;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
ans=a*70+b*21+c*15; /*三人同行七十稀, 五树梅花廿一枝, 七子团圆正半月*/
while(ans>105)
{
ans=ans-105; /*除百零五便得知*/
}
if(ans<10||ans>100) printf("Case %d: Noanswer\n",++kcase);
else printf("Case %d: %d\n",++kcase,ans);
}
return 0;
}
____百度文库资料_______
这类题目看起来是很难计算的,可是我国古时候却流传着一种算法,名称也很多,宋朝周密叫它“鬼谷算”,又名“隔墙算”;杨辉叫它“剪管术”;而比较通行的名称是“韩信点兵”。最初记述这类算法的是一本名叫《孙子算经》的书,后来在宋朝经过数学家秦九韶的推广,又发现了一种算法,叫做“大衍求一术”。这在数学史上是极有名的问题,外国人一般把它称为“中国剩余定理”。至于它的算法,在《孙子算经》上就已经有了说明,而且后来还流传着这么一道歌诀:
三人同行七十稀,五树梅花廿一枝,七子团圆正半月,除百零五便得知。
分数化小数(decimal)
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a、b≤10^6,c≤100.
输入包含多组数据,结束标志为a=b=c=0.
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
——————————————————————————写到这里不会写了,我先学了大数运算之后再写吧—————————————————————————————
——————————————————————————---------------------终于学会啦———————————————————————————————————————
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define maxn 100+10
int v[maxn];
int main()
{
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=0)
{
if(a==0&&b==0&&c==0) break;
int i;
v[0]=a/b;
for(i=1; i<=c+1; i++)
{
v[i]=a*10/b;
a=a%b;
}
if(v[c+1]>=5) v[c]+=1;
printf("%d.",v[0]);
for(i=1; i<=c; i++)
printf("%d",v[i]);
printf("\n");
}
return 0;
}
排列(permutation)
用1,2,3,……9组成三个三位数abc,def,ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi"的格式输出所有解,每行一个解。提示:不必太懂脑筋
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
int i;
for(i=123; i<=329; i++)
{
int a,b,c,d,e,f,g,h,p;
a=i%10;
b=i/10%10;
c=i/100;
d=2*i%10;
e=2*i/10%10;
f=2*i/100;
g=3*i%10;
h=3*i/10%10;
p=3*i/100;
int temp1=0,temp2=1;
temp1=a+b+c+d+e+f+g+h+p;
temp2=a*b*c*d*e*f*g*h*p;
if(temp1==45&&temp2==362880)
printf("%d %d %d\n",i,2*i,3*i);
}
return 0;
}