【C++教程】04.求1加到100

第四章 求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内存换算为字节:4GB = 4*1024MB=4*1024^2KB=4*1024^3byte

所以是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;//单个值,一开始加的是1

    return 0;
}

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

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

    while(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;//单个值,一开始加的是1

    while(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;//单个值,一开始加的是1

    while(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;//单个值,一开始加的是1

	while (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很大时,运算次数就特别多了。如果使用等差数列求和公式,那么就只需要几次计算了,公式如下:

S_{n}=na_{1}+\frac{n(n-1)}{2}d

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

S_{n}=n+\frac{n(n-1)}{2}=\frac{n^2+n}{2}

简单代入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 < ba小于b时,返回真
a > ba大于b时,返回真
a <= ba小于或等于b时,返回真
a >= ba大于或等于b时,返回真
a == ba等于b时,返回真
a != ba不等于b时,返回真

结语

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

#include <iostream>
using namespace std;

//定义了一个函数,名字为CalcCount,返回值为int,参数为累加的上限
int CalcCount(int v_max)
{
	int count = 0;//累加结果
	int add = 1;//单个值,一开始加的是1

	while (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;
}

 

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值