今天是学习acm的第一天,记录一些学习的心得。

p34-韩信点兵

        简要题干:输入a、b、c,表示军队人数模3,模5,模7的余数

                          输出 军队总人数

                           总人数不小于10,不超过100。

做每一道题之前,我们首先要做的就是判断数据大小,本题中最大输入数据3,5,7小于int的范围,运算最大数据是100,没有超出了int的范围

                明白了这点后,其次就是递归寻找总人数,一般的递归会长这个样子。


#include<cstdio>
using namespace std;
int main(){int a,b,c,sum,n=0;while(scanf("%d%d%d",&a,&b,&c)){//分别输入模三,模五,模七的余数int i;for(i=10;i<=100;i++){           //人数限制if(i%3 ==a && i%5 ==b && i%7==c){//判断人数是否符合条件printf("Case %d: %d",++n,i);break;//得到数字后跳出循环判断}}if(i>100){//在10-100中没有对应的数字,跳出后输出printf("Case %d: No Answer",++n);}}return 0;
}

但是我们仔细观察,发现他循环了90次,执行时间太长了,我们可不可以进行优化呢,答案是可以的。

样例如下,我们来观察一下有什么区别。

#include <iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;int main(){int a,b,c,n=0;while(scanf("%d %d %d",&a,&b,&c)!=0){int i://循环因子if(7+c>10){i=7+c;}elsei=14+c;for(i;i<=100;i+=7)//i=1+7 和 i+=7 一样,但是 i+=7 更快{if(i%5==b&&i%3==a){printf("Case %d: %d",++n,i);break;//得到数字后跳出循环判断}}if(i>100){printf("Case %d: No Answer",++n);}}return 0;}

确实下面的这种检索方式要比上面快很多,这就是acm的目的,谁程序可以优化的最好,我们平时在练习中就要意识到这一点。

p35-子序列的和

简要题干:给定两个数:m、n(数据范围n<m<10的6次方),要求输出从1/n^2+1/(n+1)^2....+1/m^2的值的前五位小数。

输入包含多组数据。结束标记为n=m=0。

做每一道题之前,我们首先要做的就是判断数据大小,本题中最大输入数据10的6次方小于int的范围,但是运算最大数据10的12次方,超出了int的范围所以需要优化,有些人可能会选择使用long,但是这里我们将1/n^2变为1/n/n,这个数据越界的问题就解决了。

我们开始分析这道题,“输入包含多组数据。结束标记为n=m=0”这有通用的代码,即为

while(scanf("%d%d",&n,&m)!= 0 && m && n)

那么我们的代码也就可以顺势写出

#include <cstdio>
using namespace std;
int main(int argc, char *argv[])
{int m,n,kase=0;while (scanf("%d%d",&n,&m)!=0 && n && m){double sum=0;for (int i=n;i<=m;i++){sum+=1.0/i/i;}printf("Case %d:%.5f\n",++kase,sum);}return 0;
}

p35-分数化小数

简要题干:输入三个正整数a、b、c(a,b≤10的6次方,c≤100)

包含多组数据,结束标记为a=b=c=0。

输出a/b的小数形式,精确到前c位。

我们还是先看数据类型,本题中最大输入数据10的6次方小于int的范围,而且运算最大数据小于10的6次方,所以int妥妥滴够

我们接着分析,“输入包含多组数据。结束标记为n=m=0”这有通用的代码,即为

while(scanf("%d%d%d",&a,&b,&c)!= 0 && a && b && c)

但是这样子写代码可能不会通过输入测试!!!

例如 输入abc为2 2 0;或者输入abc为0 2 2;程序自动停止无法输出本次答案甚至之后的输入也被停止,我们要增强我们程序的健壮性和鲁棒性,以达到减少错误的目的。

本题除法的除数不为0,所以我们的代码这样子写.

while(scanf("%d%d%d",&a,&b,&c)!= 0  && b)

那么怎么输出c位小数呢?用不了%.f,我们只能循环迭代做处和取模的操作,模拟除法竖式。

所以代码如下:

#include <iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;int main(){int a,b,c;while(scanf("%d %d %d",&a,&b,&c)!=0&&b){if(a==0){printf("0\n");}else{if(c==0){printf("%d\n",a/b);}else{int t[101]={0};int p[101]={0};t[0]=a/b;p[0]=a%b;int i=1;for(i;i<=c;i++){t[i]=p[i-1]*10/b;//模拟竖式计算除法的*10p[i]=p[i-1]*10%b;}t[i]=p[i-1]*10/b;if(t[i]>=5){t[i-1]++;}printf("%d",t[0]);printf(".");for(int i=1;i<=c;i++){printf("%d",t[i]);}printf("\n");}}
}return 0;
}

刘汝佳算法竞赛入门例题-循环部分相关推荐

  1. 刘汝佳算法竞赛入门经典 第二单元习题答案自编

    欢迎交流讨论! @2-1 #include <fstream> using namespace std;ifstream fin("aplusb.in"); ofstr ...

  2. 刘汝佳算法竞赛入门经典第三章习题

    /*给出一些容易理解的解题方法  但是没有oj评测 所以无法保证一定正确  矩阵的旋转给出了左旋和右旋 不确定题目3-5是哪一种*/ 习题3-1分数统计(stat) 输入一些学生的分数,哪个分数出现的 ...

  3. 刘汝佳算法竞赛入门 UVA-11809 Floating-Point Numbers 暴力写法。

    题目大意:计算机常用阶码-尾数的方法保存浮点数.如 图3-9所示,如果阶码有6位,尾数有8位,可以表 达的最大浮点数为0.1111111112×21111112.注意小 数点后第一位必须为1,所以一共 ...

  4. 刘汝佳算法竞赛入门习题3-3

    题目:数数字 把n(n≤10000)个整数顺次写在一起:1234567891011112······数一数0~9各出现多少次 代码如下: #include<stdio.h> #includ ...

  5. 刘汝佳算法竞赛第二版习题3-2思路

    最近在看刘汝佳编写的紫皮算法书,第三章后面有个习题,尝试写了一下,总感觉能找到更加便利的解题方法,但能力有限没想到. 上网搜索了一下,也没找到能让我眼前一亮的方法,那就暂且把我写的shi山放出来让大伙 ...

  6. 刘汝佳算法入门笔记(1)

    刘汝佳算法入门笔记 习题4-2 习题4-2 有n行n列(2≤n≤9)的小黑点,还有m条线段连接其中的一些黑点.统计这些线段连成 了多少个正方形(每种边长分别统计). 行从上到下编号为1-n,列从左到右 ...

  7. 破损的键盘(刘汝佳-算法入门经典第六章)

    感谢原文博主对此题的解释!笔者在原文基础上进行了部分注释以表达自己的理解,如有错误,恳请指正! 原文链接:https://blog.csdn.net/gyh_420/article/details/7 ...

  8. 算法竞赛入门(2)学习笔记——循环结构程序设计

    C语言学习 一:for循环 二:while循环和do-while循环 三:循环的代价 四:算法竞赛中的输入输出框架 五:习题 5.1 水仙花数 5.2 韩信点兵 5.3 倒三角形 5.4 子序列的和 ...

  9. 多阶段决策问题——DAG(算法竞赛入门经典笔记)

    多阶段决策问题--DAG 本文为算法竞赛入门经典第九章第三节的笔记(刘汝佳. 算法竞赛入门经典.第2版[M]. 清华大学出版社, 2014.) 多阶段决策问题:每作一次决策就可以得到解的一部分,当所有 ...

最新文章

  1. 谷歌放出AI平民化大招: 李飞飞宣布推出AutoML云平台,让普通企业也能用上深度学习
  2. 交通工程专业的计算机论文,交通工程(毕业论文).doc
  3. 28、Power Query-分支语句的妙用
  4. Amr and Pins
  5. Django ORM QuerySet集合对象的特性
  6. EasyUI权限(二星权限)
  7. 终端短路和终端开路的无耗传输线的输入阻抗和导纳
  8. Knockout v3.4.0 中文版教程-13-控制文本内容和外观-css绑定
  9. mysql-innodb-undo和redo
  10. Redis基础--使用treeNMS管理及监控Redis
  11. 计算机win7如何加快开机速度,win7如何提高开机速度实现8秒内完成开机【图文】...
  12. 转载黑苹果10.13N卡驱动方法
  13. JAVA制作QQ空间点赞_仿QQ空间点赞列表的实现【原创】
  14. JS脚本defer的作用 (转自一路前行)
  15. Excel如何筛选数据重复项?
  16. 批量缩小图片大小的方法
  17. GPU CPU NPU
  18. 热加工作业考研题目答案分享——Joining processes 4
  19. VR系列——Oculus Audio sdk文档:一、虚拟现实音频技术简介(1)——概述
  20. 从企业角度看人才培养与人才成长

热门文章

  1. #读书笔记# 《人性的弱点》| 人际关系的基本技巧
  2. AlexNet网络的结构详解与实现
  3. 利用Python发送微信消息的方法
  4. 【Machine Learning 学习笔记】feature engineering中noisy feature的影响
  5. python云计算主要是干嘛的_阿里巴巴python云计算是干什么的
  6. QTreeWidget遍历所有子节点以及删除整个TreeWidget
  7. STL源码剖析——空间配置器
  8. STM32CUBEMX F103 HAL库开发之 USB虚拟串口
  9. 马云:等阿里IPO时你就知道我们赚多少了
  10. 华为十年技术总监教你如何学好Jmeter接口测试+压力测试!!!