第四章 求1加到100

前言

该问题就是求1加2,再加3,一直加到100的值。此章我们用代码来实现一下,并介绍用到的C++语法知识。

1.神童高斯

1786年,高斯9岁的时候,由于他老师想打发一下上课时间,于是让学生们计算1加到100的结果,他心想必然不太可能这么快算出来,结果高斯用了不同于硬算的方法很快得出了结果。就在前不久我那读初一的妹妹给我说到有次挨打就是因为求这个问题,我心里一惊我小时候也应为这个问题被我爸打过。所以有些结论现代人看上去很简单,在以前的时代其实并不是那么容易得出的,并不是以前的人比现代人笨,而是现代人站在了巨人的肩膀上,在一些事情上,经典或许比潮流更有价值。

2.控制结构

计算机天生适合做重复性劳动,现在的CPU可以一秒钟计算几十亿次加法,所以我们依次加对应的值计算就可以了。在进入主函数后,程序依次往后执行。但编程语言可以通过循环结构反复的执行一段代码;又或是判断条件,选择执行某一部分的代码,这个叫选择结构;直接结束函数的执行,跳转到某一代码位置,这个叫跳转语句;以上都被称为控制结构,也就是控制程序运行的顺序。

在这个求和问题中,我们可以通过循环执行加法,从而计算出结果。而最简单的循环结构是通过while关键字来实现的,如下:

while(条件)
{//执行内容
}//条件为假时才会跳出循环,接着执行这里的语句

3.int类型

int类型是一种基本数据类型,用来表示整数。在32位和64位程序中,都是32位大小,也就是在内存中需要32位二进制来表示它,也就是4个字节。我们在代码中定义一个int型变量,用于保存整数,程序在运行时,就会在内存中占用4个字节的空间。我们可以计算一下4G的内存条可以保存多少个int型变量:

4G内存换算为字节:

所以是1024的3次方个,也就是大概10亿个。

然后int类型可以表示多少个值呢?也就是2^32,等于4294967296。虽然43亿是一个很大的数字,但是随便在纸上多写几位就超过了,在处理更大的数字时,就不能使用int类型了。不过只要计算的数字不会太大,就可以暂时不用考虑这个问题。

int类型是可以表示负数的,所以它的实际取值范围为[-2147483648,2147483647]。当然这是整数,二进制的值本身就是整数,是离散的。如果要表示小数,则是使用其他的基本数据类型,例如float、double,但是它们是不精确的,以后再完整的讲解所有的基础类型。

在本章中,使用int类型就够了。在前面的章节中也出现了int类型的身影,如果我们要定义一个int类型的变量,来保存计算的结果,就如下写:

int count = 0;//定义了一个int型变量,名字为count,初始值为0

我们还需要一个累加的变量,来表示1到100:

int add = 1;//定义了一个int型变量,名字为add,初始值为1

4.编写代码

首先先定义主函数,可以注意到主函数的返回值也是int类型,然后通过return语句返回了0:

int main()
{return 0;
}

接着定义所需的变量,来表示一个值:

int main()
{int count = 0;//累加结果int add = 1;//单个值,一开始加的是1return 0;
}

循环的进行加法计算,将add的值加到count上,然后每次循环add还需要加1,这样99次循环后,add就从1变化到了100。当循环第100次时,add大于100,不满足条件,所以结束循环执行while花括号括起来外面之后的语句,也就是return 0;退出了主函数,即将结束程序运行:

int main()
{int count = 0;//累加结果int add = 1;//单个值,一开始加的是1while(add <= 100)//大于100时就不循环了(等于100时还需循环){count = count + add;//count加上add的值add = add + 1;//add每次循环加1}return 0;
}

虽然求得了1加到100的值,保存到了count变量里,但还需要用标准库的iostream输出打印到控制台,不过在这之前可以用编译器的断点调试功能,查看各个变量的值,在下图return 0;结束整个程序之前那一行代码的左侧点击一下,就可以添加一个断点:

当程序运行到此处时就会中断,并且在下方的窗口可以看到变量的值:

再点绿色按钮继续,就可以继续程序的执行,这时就会主函数返回,从而结束整个程序。

最后按照第三章的输出方法,打印出count的值,整个代码如下:

#include <iostream>
using namespace std;int main()
{int count = 0;//累加结果int add = 1;//单个值,一开始加的是1while(add <= 100)//大于100时就不循环了(等于100时还需循环){count = count + add;//count加上add的值add = add + 1;//add每次循环加1}cout << "1加到100的值为:" << count;//此处暂停一下程序cin >> add;return 0;
}

5.问题拓展

很容易发现,如果要算1加到200,只需要将while循环判断的条件改一下。如果我们需要同时输出1加到100,和1加到200,难道需要复制整个代码然后再修改某一处吗?我的经验就是重复的代码越少越好,所以我们将问题抽象成1加到N的值是多少。抽象问题后,就可以写成一个函数,来反复执行通用的功能,只是参数条件变化了。和主函数一样,定义一个普通的函数,取名为CalcCount:

//定义了一个函数,名字为CalcCount,返回值为int,参数为累加的上限
int CalcCount(int v_max)
{//TODO(TODO意为尚未完成的代码)return TODO;
}

接下来实现函数的运算过程,从主函数剪切过来,简单修改一下(注意注释也要更新!):

//定义了一个函数,名字为CalcCount,返回值为int,参数为累加的上限
int CalcCount(int v_max)
{int count = 0;//累加结果int add = 1;//单个值,一开始加的是1while(add <= v_max)//大于v_max时就不循环了(等于v_max时还需循环){count = count + add;//count加上add的值add = add + 1;//add每次循环加1}return count;
}

在主函数,就使用CalcCount函数即可,只负责输出显示结果:

#include <iostream>
using namespace std;//定义了一个函数,名字为CalcCount,返回值为int,参数为累加的上限
int CalcCount(int v_max)
{int count = 0;//累加结果int add = 1;//单个值,一开始加的是1while (add <= v_max)//大于v_max时就不循环了(等于v_max时还需循环){count = count + add;//count加上add的值add = add + 1;//add每次循环加1}return count;
}int main()
{//这里直接将对应的值传入CalcCount函数,返回计算后的值再显示即可cout << "1加到100的值为:" << CalcCount(100) << endl;//再输出一个endl用于换行cout << "1加到200的值为:" << CalcCount(200) << endl;cout << "1加到300的值为:" << CalcCount(300) << endl;cout << "1加到400的值为:" << CalcCount(400) << endl;cout << "1加到500的值为:" << CalcCount(500) << endl;//此处暂停一下程序int x;cin >> x;return 0;
}

运行程序,结果如下:

不过为了彰显计算机擅于重复操作的说法,可以再写一个循环语句,循环的输出:

int main()
{int v_max = 1;while (true){cout << "1加到" << v_max << "的值为:" << CalcCount(v_max) << endl;v_max = v_max + 1;}//此处暂停一下程序int x;cin >> x;return 0;
}

当v_max比较大的时候,输出的结果也会更大。当输出值超过int类型可以表示的范围时,就会出现负数,至于为何是负数,以后再解释。不过在很多游戏里应该见过不少数字过大变为负数的情况了。

6.算法改进

很多人一说到算法,就会觉得多么高大上。的确也很高大上,高大的是研究算法的人,新算法的计算过程完成相同的事情,但计算所执行的步骤更加简洁。如果使用上面的累加办法,累加到N则需要进行N次加法,当N很大时,运算次数就特别多了。如果使用等差数列求和公式,那么就只需要几次计算了,公式如下:

由于首项为1,公差为1,则具体公式为:

简单代入100或200验证得出结果一致,所以再编写一个新算法的函数:

//采用等差数列公式的计算方法
int CalcCount2(int v_max)
{return (v_max * v_max + v_max) / 2;
}

接着在主函数略微修改一下,同时输出两个函数的值,运行之后可以发现两者输出的值是一样的:

 int v_max = 1;while (true){cout << "1加到" << v_max << "的值为:" << CalcCount(v_max) << ", " << CalcCount2(v_max) << endl;v_max = v_max + 1;}

7.写法简化

上面为了方便理解没有写出最简的写法,这里说明一下。

a = a + b的含义是计算a加上b的值后再赋值给a,比如一开始a为10,b为20,那么执行之后a的值为30,b的值不变。a = a + b的写法可以简写为a += b,如下:

a = a + b;//和下面一样的功能
a += b;//简写

当b为正负1的时候,则有更简化的写法:

//自加1,三种写法一样
a = a + 1;
++a;//一般优先使用++a
a++;//自减1,不过自减1一般用得较少
a = a - 1;
--a;//同样一般优先使用--a,
a--;

8.判断大小

在本例中还用到了判断变量大小的逻辑,判断a与b的大小通过以下操作符,返回真或假。作为while循环的条件,返回真时,while循环才会继续执行,否则跳出循环,执行while后面外部的语句。这里列出判断大小的操作符,它和函数有点像,返回的是一个bool(布尔)类型的值,它代表逻辑的真或假,也就是true或false,它可以作为while的条件判断。

a < b a小于b时,返回真
a > b a大于b时,返回真
a <= b a小于或等于b时,返回真
a >= b a大于或等于b时,返回真
a == b a等于b时,返回真
a != b a不等于b时,返回真

结语

本章通过一个简单的数学问题,示范了一些最基本的C++代码。同时还介绍了循环结构、断点、函数的用法示例。在这个完整示例代码上你可以按自己的想法进行修改,从而深入理解本章的内容。下面为新手考虑,附上完整的代码:

#include <iostream>
using namespace std;//定义了一个函数,名字为CalcCount,返回值为int,参数为累加的上限
int CalcCount(int v_max)
{int count = 0;//累加结果int add = 1;//单个值,一开始加的是1while (add <= v_max)//大于v_max时就不循环了(等于v_max时还需循环){count += add;//count加上add的值++add;//add每次循环加1}return count;
}//采用等差数列公式的计算方法
int CalcCount2(int v_max)
{return (v_max * v_max + v_max) / 2;
}int main()
{int v_max = 1;while (true){cout << "1加到" << v_max << "的值为:" << CalcCount(v_max) << ", " << CalcCount2(v_max) << endl;v_max = v_max + 1;}//此处暂停一下程序int x;cin >> x;return 0;
}

【C++教程】04.求1加到100相关推荐

  1. 编写一个程序,求1加到100的和

    package demo;public class Example3_1 {public static void main(String[] args) {int sum=0;for (int i=1 ...

  2. 求k从1加到100+k的平方从1加到50+1/k从1到 10

    //求k从1加到100+k的平方从1加到50+1/k从1到 10#include <stdio.h> #include <math.h>int main() {int i;do ...

  3. 用c语言求出1加到100的和

    //求出1到100的和 #include"stdio.h" int main() { int i,sum=0; //把sum初始定义为0 for(i=1;i<101;i++) ...

  4. 【CC2530入门教程-04】CC2530的定时/计数器原理与应用

    [CC2530入门教程-06]CC2530的ADC工作原理与应用 [CC2530入门教程-05]CC2530的串行接口原理与应用 [CC2530入门教程-04]CC2530的定时/计数器原理与应用 [ ...

  5. [译]Vulkan教程(04)基础代码

    [译]Vulkan教程(04)基础代码 General structure 通用结构 In the previous chapter you've created a Vulkan project w ...

  6. C语言试题十三之求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整书,并将他们放在a所指的数组中,通过n返回这些数的个数。

    1. 题目 求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整书,并将他们放在a所指的数组中,通过n返回这些数的个数. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试. ...

  7. linux系统计算从1加到100之和思路风暴

    博文前言:    本博文为<老男孩linux就业培训中心-初级班第七期课前考试及课上讲解的课后答案整理, 原题:通过shell编程或命令行方式求1+2+3...+100=?的和来活学活用shel ...

  8. echarts java动态数据_[ASP.net教程]ECharts Java 动态加载数据,echartsjava

    [ASP.net教程]ECharts Java 动态加载数据,echartsjava 0 2015-12-18 00:00:05 1.前台jsp页面html PUBLIC "-//W3C// ...

  9. java 直线交点_[Java教程]谈谈求线段交点的几种算法(js实现,完整版)

    [Java教程]谈谈求线段交点的几种算法(js实现,完整版) 0 2014-08-27 10:05:22 "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面 ...

  10. 【OpenCV DNN】Flask 视频监控目标检测教程 04

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 [OpenCV DNN]Flask 视频监控目标检测教程 04 3.4 用Flask构建流媒体服务器 3.4.1 流媒体服务器基本 ...

最新文章

  1. CSS Sprite的应用
  2. 用法 the_【课堂】a、an、the的用法
  3. Windows编程—控制面板程序显示信息修改(程序图标、名称、链接等)
  4. Prometheus 监控服务端口、网站状态等(黑盒监测)
  5. unity 创建NGUI字体
  6. 【转】pda的广播扫码uni-app
  7. copy php是否开启_命令行方式启动php服务
  8. IOS:static和extern的使用
  9. 如何看待Corona渲染器,它是否会影响国内vray渲染器的地位?
  10. Proteus20个应用技巧
  11. uniapp使用web-view跳转外部链接
  12. CentOS7关于hostname
  13. 应用于音箱领域中的音频功放IC型号推荐
  14. 自增主键的sql设置语句
  15. JTAG篇(5) OpenOCD 写入数据到TAP
  16. Andoird conflicts with another tag that has the same ID
  17. 最新最火的十大网络流行语排行榜火热出炉,幽默搞笑网络段子来袭!
  18. 【虚拟语气练习题】unless
  19. 利用包含排斥原理求出给定范围内素数个数的问题
  20. x264.exe下载

热门文章

  1. android url后缀名,Android获取URL中文件的扩展名的方法
  2. php 汉字转拼音 扩展,PHP中文转拼音扩展
  3. 【《编码(Coding)》读后感】隐匿在计算机软硬件背后的语言
  4. 2016word多级列表 一级标题居中后偏左
  5. 【信号与系统】Multisim 仿真抽样定理与信号恢复
  6. linux系统中rpm啥意思,Linux系统中的RPM简说
  7. 段码液晶屏实现原理和需要注意的事项
  8. vue路由守卫和重定向
  9. linux7输入法切换,centos7如何切换输入法
  10. 解决win10中无法打开CHM文件的方法