1. 程式人生 > >10-22(第八週週一)上課簡記:三種迴圈結構

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