因为那样非但不能提高系统运行效率,减少循环次数,而且由于有了附加的运算,还会使程序运行效率更低。
思考1:
如果我想根据用户输入情况判断用户输入的数字是不是素数怎么办呢?
思考2:
如果想要先显示素数的个数,然后再显示所有数字怎么操作呢?
解决方法至少2种:
把程序运行两遍,第一遍用来计算数量,第二遍用来输出所有数字;
利用数组,把所有数字存储到数组中,然后统一显示。
思考3:
如果要计算的是一个非常大的范围,那么这个程序运行将会是非常慢的,有没有更好的办法呢?
4、输入一个字符组成的菱形图案,输出结果如下:
、程序分析
先来分析一下这个图。
这个图,一共有9行,第一行是4个空格,一个*,第二行是3个空格一个*,然后一个空格,一个*。
到第5行的时候是0个空格,一个*,7个空格,一个*。
图的上下两部分明显是有规律可循的,所以可以用以下方法输出:
、程序流程
For()//条件5行.用来输出上半部分
{
For()//控制空格数
{输出空格}
输出*
For()//控制中间的空格数
{输出空格}
输出*
}
For()//条件4行.用来输出下半部分
{
For()//控制空格数
{输出空格}
输出*
For()//控制中间的空格数
{输出空格}
输出*
}
网上查到的写法基本都是这样。
但是我想说,如果换个思维方式,不用这么麻烦。
不用拆分成两部分一样能搞定。
不知道大家看明白没有?
这个的做法是:
想象一下,这个图形在一个矩形的区域内,区域内指定的点是*,其它点是空格(就好像咱们的电脑显示汉字一样)。
所以我们只要找到每行首应该显示的空格数量就可以了。
思考:
如果把这个图形放到一个数组中应该如何实现?
3、求水仙花数。
水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。
(例如:
1^3+5^3+3^3=153)
.程序分析:
先要分解出每个数位上面的数字,然后可以做判断,如果符合条件的(即每个位上的数字的n次幂之和等于它本身)就输出,如果在指定范围内就可以利用for循环控制个数。
这个程序对于大家来说难点就在如何把各个数字分解出来。
.程序源代码:
运行结果如下:
思考:
如果加个要求,允许对方手动输入数字的位数(即n的值)应如何写。
4、兔子产仔问题
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,假如也从来不生病,假如从来不偷懒每月按时生产,假如也不会近亲结婚,假如它们都有地方住,并且还总有吃的饿不死……问每个月的兔子总数为多少?
(为什么那么多假如,如果没有那么多假如,咱们的程序都没有bug了,微软也不用发布系统漏洞了)
、别总想着一对兔子是两只,咱们最后乘以2就是多少只,不乘2就是多少对。
兔子的规律为1,1,2,3,5,8,13,21....其实就是后一个数是前两个数的和。
.程序源代码:
运行结果如下:
其实上面的例子可能还是不好理解,有没有更好理解的方法呢?
例如:
这样写:
只要兔子不是1对,那就直接计算前两个数的和。
调用方法如下:
运行结果如下:
这种算法就是递归(程序调用自身),看起来比较容易理解吧!
再来看个递归的例子。
5、阶乘。
、何为阶乘:
正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。
、解题思路:
我们倒着看n的阶乘就是n*(n-1)*(n-2)*(n-3)*……*1,既然找到了规律剩下的事情就好办了:
、程序源码如下:
运行结果如下:
思考:
如果不用递归怎么做?
6、汉诺塔问题
、汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
(来源于XX百科)
、解题思路:
假设三根柱子分别是A、B、C,总之要把A柱子上面的圆盘移动到C上面。
我多么多么的希望只有一个圆盘!
那么就可以这样了:
A->C。
但是现在不是一个是如果是两个那么就是:
A->B,A->C,B->C;如果是三个盘子呢,应该就是A->C,A->B,C->B,A->C,B->A,B->C,A->C,然后我们再从中找出规律……这样做就是麻烦的方法了。
我们可以用把大象装冰箱里的方法去解决。
现在我们把所有的盘子看成两部分,一部分是最下面一个盘子,第二部分是除了最下面的那个的所有盘子,于是我们只需要把上面的那个整体移动到B(即A->B),然后我们把最下面的盘子移动到C(即A->C),最后把那个整体移动到C(即B->C)。
您会问,那个B不是个整体吗?
怎么移动啊?
继续让它执行刚才的过程呗。
、程序代码如下:
运行结果如下:
这个问题最不好理解的地方就是:
把n-1当做一个整体去处理。
注意,实际使用中,递归的长处是可读性高,程序好理解,但是没有循环语句效率高。
具体使用中到底用哪个要看问题是什么。
像计算阶乘就没有必要用递归。
但是像汉诺塔问题,如果不用递归就会很复杂了。
7、数组
、所谓数组,就是相同数据类型的元素按一定顺序排列的集合。
(来源于XX百科)数组里面的数据类型可不一定是基本类型。
C和basic数组的几个区别,basic的数组是可变大小的,但是c是固定大小的,basic的数组下标从1开始,C下标由于是地址偏移量所以是从0开始。
C中的数组和指针实际是同一个东西,所以用的时候混着用。
由于是从c#下调试所以使用中和纯粹的C语言也有所区别。
实际应用中,在.net环境下除非是参数数组,其它时候一般使用List,如果是二维数组一般用List、DataTable或者数据库去完成。
、数组怎么用?
咱们先看两个关于数组显示输出的问题。
练习1:
计算素数,要求先显示指定范围内一共多少素数,然后再显示出来。
程序分析:
我们可以用一个变量来记录数量,用一个数组来记录数字,然后再遍历数组,显示出来。
程序代码如下:
运行结果如下:
思考:
程序显示素数的时候为什么不用foreach,而是用效率相对低的for?
其中注释掉的是List的使用方法,有兴趣可以看看。
其实List要比直接用数组效率更高。
练习2:
输出菱形图案。
程序分析:
这次像上面一样一行数据就不能解决问题了,就需要使用到二维数组。
二维数组就好像一个表格一样。
我们可以像表格的行列一样去访问数据。
程序代码如下:
由于两个显示输出同时生效,所以输出结果是两个菱形:
至于到底用哪个语句输出看个人习惯。
8、矩阵
、矩阵是指纵横排列的二维数据表格。
、计算矩阵乘法
、分析:
在计算机中,一个矩阵实际上就是一个二维数组。
一个n行m列的矩阵与一个m行p列的矩阵可以相乘,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数为第一个矩阵第i行上的m个数与第二个矩阵第j列上的m个数对应相乘后所得的m个乘积之和。
(以上算法,来自XX)
其实就是矩阵1的i行所有数字分别乘以矩阵2的j列所有数字之和.用编程语言翻译一下就是:
结果矩阵[i,j]=矩阵1[i,k]*矩阵2[k,j]+矩阵1[i,k+1]*矩阵2[k+1,j]+……其中的k是有规律可循的,可以用一个循环去做.
(因为在C#下调试所以这里使用了c#的写法)
、既然有了算法,我们就把算法用程序设计语言描述出来
运行结果如下:
9、打印出杨辉三角形
、杨辉三角是这个样子的:
、程序分析:
如果直接打印一个这样的图形不太好弄,所以咱们把所有数字都左对齐,如果弄一个这样的就好办多了:
可以看出每行的开始和结尾都是1,中间的数是对着的上面两个数的和。
我们先把所需要的所有数字,全都存储到一个二维数组中,然后再通过调整格式的方式输出我们需要的三角形。
、程序代码如下:
输出结果本题开头那两个截图。