博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《算法竞赛入门经典》第1章 程序设计入门
阅读量:5034 次
发布时间:2019-06-12

本文共 2433 字,大约阅读时间需要 8 分钟。

提示1-1:整数值用%d输出,实数用%lf输出。

提示1-2:整数/整数=整数,浮点数/浮点数=浮点数。

提示1-3:scanf中的占位符和变量的数据类型应一一对应,且每个变量前需要加&(取地址)符号。

提示1-4:在算法竞赛中,输入前不要打印提示信息。输出完毕后应立即终止程序,不要等待用户按键,因为输入输出过程都是自动的,没有人工干预。

提示1-5:在算法竞赛中不要使用头文件conio.h,包括getch()、clrscr()等函数。

提示1-6:在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行的行首不应有空格,但行末通常可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。

提示1-7:尽量用const关键字声明常数。

1 const double pi = 4.0 * atan(1.0);

这里声明了一个叫pi的符号,但是const关键字表明它的值是不可以被改变的——pi是一个真正的数学常数。有的读者可能会用math.h中定义的常量M_PI,但其实这个常数不是ANSI C标准的,不信的话可以用"gcc -ansi"编译试试。

提示1-8:赋值是个动作,先计算右边的值,在赋给左边的变量,覆盖它原来的值。

提示1-9:printf的格式字符串中可以包含其他可打印字符,打印时原样输出。

 

例题1-2 三位数反转

输入一个三位数,分离出它的百位、十位和各位,反转后输出。

样例输入:127

样例输出:721

1 #include 
2 3 int main()4 {5 int n;6 scanf("%d", &n);7 printf("%d%d%d\n", n%10, n/10%10, n/100);8 return 0;9 }

运行结果如下:

说明:运算符*、/、%的优先级相同(优先级4),为左结合性,即从左往右运算。

上面的程序输出027,但要改成输出27似乎会比较麻烦——我们必须判断n&10是不是0。一个解决方法是把结果储存到变量m当中,这样,直接用%d格式输出m,将输出27。如果要输出027也很容易,把输出格式变为%03d即可。

1 #include 
2 3 int main() 4 { 5 int n, m; 6 7 scanf("%d", &n); 8 m = (n % 10) * 100 + (n / 10 % 10) * 10 + n / 100; 9 printf("%03d\n", m);10 return 0;11 }

运行结果如下:

提示1-10:算法竞赛的题目应当是严密的,各种情况下的输入均应有严格规定。如果在比赛中发现题目有漏洞,应向相关人员询问,而尽量不要自己随意假定。

 

例题1-3 交换变量

输入两个整数a和b,交换二者的值,然后输出。

样例输入:824 16

样例输出:16 824

1 /* 三变量法 */ 2 #include 
3 4 int main() 5 { 6 int a, b, t; 7 8 scanf("%d%d", &a, &b); 9 t = a;10 a = b;11 b = t;12 printf("%d %d\n", a, b);13 14 return 0;15 }

也可以不使用中间变量

1 /* 两变量法 */ 2 #include 
3 4 int main() 5 { 6 int a, b, t; 7 8 scanf("%d%d", &a, &b); 9 a = a + b;10 b = a - b;11 a = a - b;12 printf("%d %d\n", a, b);13 14 return 0;15 }

最合适的程序莫过于

1 #include 
2 3 int main() 4 { 5 int a, b, t; 6 7 scanf("%d%d", &a, &b); 8 printf("%d %d\n", b, a); 9 10 return 0;11 }

换句话说,我们的目标是解决问题,而不是为了写程序而写程序,同时应保持简单(Keep It Simple and Stupid,KISS),而不是自己创造条件去展示编程技巧。

提示1-13:算法竞赛是在比谁能更好地解决问题,而不是在比谁写的程序看上去更高级。

 

例题1-4 鸡兔同笼

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

1 #include 
2 3 int main() 4 { 5 int a, b, n, m; 6 7 scanf("%d%d", &n, &m); 8 a = (4*n -m) / 2; 9 b = n - a;10 if (m % 2 == 1 || a < 0 || b < 0)11 {12 printf("No answer\n");13 }14 else15 {16 printf("%d %d\n", a, b);17 }18 19 return 0;20 }

运行结果如下:

 

 

 

 

转载于:https://www.cnblogs.com/rezone/p/3201659.html

你可能感兴趣的文章
css修改滚动条样式
查看>>
2018.11.15 Nginx服务器的使用
查看>>
Kinect人机交互开发实践
查看>>
百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET...
查看>>
JAVA 技术类分享(二)
查看>>
android客户端向服务器发送请求中文乱码的问
查看>>
BZOJ4977 八月月赛 Problem G 跳伞求生 set 贪心
查看>>
BZOJ2631 tree LCT
查看>>
Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂
查看>>
UOJ#220. 【NOI2016】网格 Tarjan
查看>>
取消事件冒泡
查看>>
Symfony翻译教程已开课
查看>>
Python模块之pickle(列表,字典等复杂数据类型与二进制文件的转化)
查看>>
通过数据库表反向生成pojo类
查看>>
Jsoup操作
查看>>
android优化内存_下
查看>>
js 多张爆炸效果轮播图
查看>>
两个input放一行不能对齐
查看>>
实训作业2
查看>>
带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
查看>>