10-22(第八周周一)上课简记:三种循环结构

1. 思考:如何快速计算1+2+3+。。。。+100的值呢?

可以通过50次循环,第一次,sum加上1和100,最后一次sum加上50和51。

#include<stdio.h>
int main()
{
	int i,j,sum=0;
    for(i=1,j=100;i<=j;i++,j--)  //通过逗号表达式给i和j赋初值
	{
		sum=sum+i+j;
	}	
	printf("sum=%d\n",sum);
	return 0;
}

2. 用三种循环语句编程计算从键盘输入n个整数的和。

  • 用for语句:
#include<stdio.h>
int main()
{
	int i,sum=0,m,n;
	scanf("%d",&n);
    for(i=1;i<=n;i++) 
	{
		scanf("%d",&m);
		sum=sum+m;
	}	
	printf("sum=%d\n",sum);
	return 0;
}
  • 用while语句
#include<stdio.h>
int main()
{
	int i=1,sum=0,m,n;
	scanf("%d",&n);
    while(i<=n)
	{
		scanf("%d",&m);
		sum=sum+m;
		i++;
	}	
	printf("sum=%d\n",sum);
	return 0;
}
  • 用do-while语句实现
#include<stdio.h>
int main()
{
	int i=1,sum=0,m,n;
	scanf("%d",&n);
	do
	{
		scanf("%d",&m);
		sum=sum+m;
		i++;
	}while(i<=n);	
	printf("sum=%d\n",sum);
	return 0;
}

3. 利用循环语句来解决穷举问题

  • 问题:将一张100元的钞票换成等值的10元、5元、2元、1元的小钞票,要求每次换成40张小钞票,每种至少一张,试编程找出所有可能的换法。
  • 解答:100元全部换成10元的,10元的最大数目是10张。
    100元全部换成5元的,5元的最大数目是20张。
    100元全部换成2元的,2元的最大数目是50张。
    100元全部换成1元的,1元的最大数目是100张。
    已知每种都至少一张,且张数的总和是40。编出最原始的程序如下:
#include<stdio.h>
int main()
{
	int i,j,k,m;
	for(i=1;i<=10;i++)
	  for(j=1;j<=20;j++)
		for(k=1;k<=40;k++)
		  for(m=1;m<=40;m++)
			if(i+j+k+m==40&&i*10+j*5+k*2+m==100)
			   printf("100:%d,5:%d,2:%d,1:%d\n",i,j,k,m);	
	return 0;
}

另一种思路:

#include<stdio.h>
int main()
{
	int x10,x5,x2,x1;
	for(x10=1;x10<=7;x10++)
	  for(x5=1;x5<=17;x5++)
		for(x2=1;x2<=37;x2++)
		{
			x1=40-x10-x5-x2;
			if(x10*10+x5*5+x2*2+x1==100&&x1>0)
			 printf("100:%d,5:%d,2:%d,1:%d\n",x10,x5,x2,x1);
		}		   	
	return 0;
}
  • 同理,思考下搬砖问题:36块砖,36人搬:男搬4,女搬3,两个小孩抬1,要求一次全搬完,问男、女、小孩各若干?

4. 利用循环结构来实现递推(从前往后)

**
- 问题:设有一对新生兔子,从第3个月开始,它们每个月都生一对兔子,新生的兔子也如此繁殖。假设兔子没有死亡,问一年后,共有多少兔子?

**

  • 分析: 第1个月的兔子对数f1=1; 第2个月的兔子对数f2=1
    第3个月的兔子对数f3=f2+f1=2(最早的一对老兔子+它们繁殖的一对兔子(新生1);
    第4个月的兔子对数f4=f3+f2=3(最早的一对老兔子+它们繁殖的一对兔子(新生1个月)+最早的一对老兔子繁殖的一对兔子(生2个月));
    第5个月的兔子对数f5=f4+f3=5(最早的一对老兔子+它们繁殖的一对兔子(新生1个月)+最早的一对老兔子繁殖的一对兔子(生2个月))+最早的一对老兔子在第3个月繁殖的那对兔子开始繁殖;
    同理类推。。。。。
#include<stdio.h>
int main()
{
	int f1=1,f2=1,sumf,n=3;
	while(n<=12)
	{
	 sumf=f1+f2;
		f1=f2;
		f2=sumf;
		n++;
	}
	printf("%d\n",sumf);
	return 0;
}

5. 利用循环结构来实现倒推(从后往前)

  • 实例1:阿米巴用简单分裂的方式繁殖,每分裂一次要用3分钟。将若干个阿米巴放在一个盛满营养液的容器内,45分钟后容器内充满了阿米巴。已知容器最多可以装阿米巴1048576个,试问:开始的时候往容器内放了多少阿米巴?
  • 分析:3分钟分裂一次,45分钟装满,所以一共分裂了15次。也就是说经过15次分裂阿米巴的数目是1048576,也即第15次分裂之后阿米巴为1048576,设x15=1048576。简单分裂也即一分为二,那么第14分裂后阿米巴数目x14=x15/2;同理,第13次分裂后阿米巴数目为x13=x14/2…,则第1次分裂后阿米巴数目为x1=x2/2,则最初的阿米巴数目,也即第1次分裂之前的数目x0=x1/2。
#include<stdio.h>
int main()
{
	int x=1048576,i;
	for(i=1;i<=15;i++)
		x=x/2;
	printf("%d\n",x);
	return 0;
}
  • 实例2:猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,并多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩一个桃子了,问第1天摘了多少桃子?
  • 分析:设猴子第1天共摘了x0个桃子。第1天剩下的桃子数为x1,第2天剩下的桃子数为x2,。。。,第9天剩下的桃子数为x9。则有:x9=x8/2-1,x8=x7/2-1。。。x1=x0/2-1
    即:x8=2*(x9+1),x7=2*(x8+1)。。。x0=2*(x1+1)
    因为第九天剩下的桃子数x9=1,所以定义迭代变量x,则上面的倒推公式转换为迭代公式x=2(x+1),迭代变化为9~1,所以迭代次数一共为9次。
#include<stdio.h>
int main()
{
	int x,i;
	for(i=1;i<=9;i++)
		x=(x+1)*2;
	printf("%d\n",x);	   	
	return 0;
}

6. 循环结构的嵌套

  • 问题:输出2~100的所有素数。素数:只能被1和本身整数的数。其中,1不是素数。
  • 测试一个数i是不是素数最简单的方法就是,用2,3,…,i-1这些数逐个去除i,只要被其中一个数整除,则i就不是素数。数学上已证明,对于自然数i只需用2,3…,测试即可。
#include<stdio.h>
int main()
{
	int i,j,flag,count=0;
	for(i=2;i<=100;i++)
	{
		for(flag=1,j=2;j<=(int)sqrt(i);j++)
		if(i%j==0)
		{
			flag=0;
			break;
		}	
		if(flag==1)
		{
			printf("%4d",i);
			count++;
			if(count%5==0)
				printf("\n");
		}
	}
	return 0;
}

7. break和continue的区别

分析下列程序的运行结果,总结continue的用法。将其替换为break,分析其运行结果。找出continue和break的区别。

#include<stdio.h>
int main()
{
	int i;
	for(i=1;i<=5;i++)
	{
		if(i%2)
			printf("*");
		else 
			continue;
		printf("#");
		}
	printf("$\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lvcongying0601/article/details/83270091