昨天老湿复习了高级循环,讲了一些进阶的循环应用,然后在课程最后涉及了一点数组的知识,但是没有细讲,明天会详细讲。
关于高级循环的最后,我总结了几道老湿的题目,也是用来练手的几道高级循环应用题,在写代码的同时也复习一遍。
题目如下:
1, 迭代进阶:兔子生兔子的问题
2, 阶乘问题:求出10以内所有奇数的阶乘的和
3, 求平方和(1的平方+2的平方+3的平方+到10的平方)
4, 2的一次方+2的二次方+2的三次方+到2的十次方
这四道题目大概就是昨天上课老湿着重讲的题目,现在一题题的分析出来
首先第一题,一对新生兔到了第三个月就可以再次繁殖一对新生兔,而且以后的每个月都可以再生一对小兔子,假设中间没有兔子死亡的话,到了第24个月有多少对兔子?
这道题乍一看没有什么思路,但是老湿给我们用EXCEL表格写出了每个月兔子数的规律,就不难发现这道题的解法了:
1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 |
一 | 二 | 三 | 四 | 五 | 六 | 七 | 八 | 九 |
幼兔 | 未成年 | 成年 | 成年 | 成年 | 成年 | 成年 | 成年 | 成年 |
幼兔 | 未成年 | 成年 | 成年 | 成年 | 成年 | 成年 | ||
幼兔 | 未成年 | 成年 | 成年 | 成年 | 成年 | |||
幼兔 | 未成年 | 成年 | 成年 | 成年 | ||||
幼兔 | 未成年 | 成年 | 成年 | 成年 | ||||
幼兔 | 未成年 | 成年 | 成年 | |||||
幼兔 | 未成年 | 成年 | 成年 | |||||
幼兔 | 未成年 | 成年 | 成年 | |||||
幼兔 | 未成年 | 成年 | ||||||
幼兔 | 未成年 | 成年 | ||||||
幼兔 | 未成年 | 成年 | ||||||
幼兔 | 未成年 | 成年 | ||||||
幼兔 | 未成年 | 成年 | ||||||
幼兔 | 未成年 | |||||||
幼兔 | 未成年 | |||||||
幼兔 | 未成年 | |||||||
幼兔 | 未成年 | |||||||
幼兔 | 未成年 | |||||||
幼兔 | 未成年 | |||||||
幼兔 | 未成年 | |||||||
幼兔 | 未成年 | |||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 | ||||||||
幼兔 |
从上表不难看出,从第三个月开始,每个月的兔子数都是上两个月兔子的和,假设当月为n,n月的兔子数就等于n-1月的兔子数加上n-2月的兔子数,规律找到了,用循环语句不难写出结果:
int t1 =1,t2=1,sum=0;//t1是第一个月的兔子数,t2是第二个月的兔子数;
for(int i =3;i<=24;i++)//从第三个月才开始叠加兔子的数量,一直叠加到第二十四个月
{
sum = t1+t2;//以下三行是解决这道题目的关键,第一行的意思是sum是上两个月兔子的和
t2=t1;//第二行,上一个月的兔子数赋值为上两个月的兔子数。
t1=sum;//第三行的意思是循环过后,这个月的兔子数重新赋值为上一个月的兔子数,
}
console.writeline(sum);//输出sum的值。
这道题最后的答案是 46368
可见兔子的繁殖能力多么强大……当然那只是题外话,关于这段代码有个值得注意的细节,在循环体里面第二三句是不可以颠倒顺序的,因为将t1的值赋值为sum以后,t2最后得到的值就跟sum相等了,这样答案就会有误差,所以一定要注意。
2 阶乘问题:求出10以内所有奇数的阶乘的和
那道题拿到以后首先要考虑的就是两层循环,一层是取10以内的偶数,一层是得出这个数字的阶乘。
关于阶乘,我这个数学不好的人当时还是不明白,比如9的阶乘(9!)它就等于9*8*7*6*5*4*3*2*1的积,再循环语句中,就等于i的值递加,然后每次i乘以本身再赋值回i,然后再递增次数就OK,至于求和就很简单了,创建一个空的整型变量每次叠加就OK
代码如下:
int sum=0;
for(int i =0;i<=10;i+=2)//得出小于10的所有偶数
{
int j =1;
for(int n=1;n<=i;n++)
{
j*=n;
}
sum+=j;
}
console.writeline(sum);
重新回来做这道题的时候我又发现了一点需要注意的地方,变量j作为存储n每次递增相乘的变量,不能声明在第一层for循环的上面,如果把j定义在第一层for循环上面的话,最后的结果与我们预期的结果是不一样的,这样的话j的循环就加上了第一层for循环的十次,数值肯定要大很多。所以在声明一个变量的时候一定要注意位置不要写错。
3, 求平方和(1的平方+2的平方+3的平方+到10的平方)
这道题相对来说很简单,平方就是两次乘以数字本身就OK,求和跟上面一样,创建一个空的整型存储起来就好了。代码如下:
int sum=0;
for(int i =1;i<=10;i++)
{
sum+=i*i;//每次i的平方都赋值于sum。
}
console.writeline(sum);
这道题比较简单,只用到了一层循环,规律也非常好找。
4, 2的一次方+2的二次方+2的三次方+到2的十次方
这道题要用到两层迭代,一层用来迭代每次乘以二的次数,第二层就是把每次的结果相加,分析规律以后,发现每次将i乘以二就能得出对应的次方数,再使用一个变量每次迭代上一次的积即可。代码如下:
int sum=0;
int j=1;
for(int i =1;i<=10;i++)
{
j*=2;//每次将j的值乘以2送回j,得到其次方值。
sum+=j;
}
console.writeline(sum);
这是老湿昨天讲的几道题,今天整理出来了,从中也复习了一遍,还有很多问题值得研究,好吧,我现在去研究了……