讓計(jì)算機(jī)數(shù)數(shù):
問(wèn)123812843267518273618273612675317 是幾位數(shù)?
怎樣讓計(jì)算機(jī)來(lái)數(shù)數(shù)?
思路:
1.讓計(jì)算機(jī)從右邊開(kāi)始數(shù)
2.對(duì)10做整除
3.不停的對(duì)10整除,直到不能整除10
while 循環(huán)

# include<stdio.h>
int main ()
{
int a,n = 0;
printf("請(qǐng)輸入一個(gè)數(shù)\n");
scanf("%d",&a);
while(a>+0)
{
n++;
a/= 10;
}
printf("你輸入的數(shù)有%d個(gè)數(shù)字\n", n);
return 0;
}
對(duì)比上面的兩個(gè)程序,你認(rèn)為哪個(gè)好一點(diǎn)?
do - while 循環(huán)
while 是先進(jìn)行判斷,再執(zhí)行循環(huán)體。do-while是先執(zhí)行循環(huán)體,再進(jìn)行判斷。
# include<stdio.h>
int main ()
{
int a,n = 0;
printf("請(qǐng)輸入一個(gè)數(shù)\n");
scanf("%d",&a);
do
{
n++;
a/= 10;
} while(a>0);
printf("你輸入的數(shù)有%d個(gè)數(shù)字\n", n);
return 0;
}
for循環(huán)
for(初始條件;循環(huán)條件;循環(huán)每輪的動(dòng)作)
{
......
}
用for寫死循環(huán):
for(;;)
{
......
}
for 的死循環(huán) 和 while 寫的死循環(huán),編譯器的優(yōu)化是不一樣的。for 寫的死循環(huán)優(yōu)化 比while 循環(huán)要好很多。

for(;條件;) == while (條件)
循環(huán)的選用大致可以參考一下建議:
1.循環(huán)固定次數(shù),用 for循環(huán)
2.如果必須執(zhí)行一次,用do-while
3.其他情況用while
循環(huán)之間基本是可以互換的。
例子:如何用1角、2角、5角的硬幣湊出10元以下的金額呢?
# include<stdio.h>
int main ()
{
int x;
int one ,two,five;
scanf("%d",&x);
for (one = 1;one < x*10;one ++){
? ? for (two = 1;two <x*10/2;two ++){
? ? ? for (five = 1;five <x*10/5;five ++){
? ? ? if(one + two*2+five *5 == x*10){
? ? ? printf("可以用%d個(gè)1角加%d個(gè)2角加%d個(gè)5角得到%d元\n",one,two,five,x);
}
}
? ? ? ? }
}
return 0;
}
如果得到一種結(jié)果后就跳出循環(huán)該怎么辦?
”連鎖 break“
# include<stdio.h>
int main ()
{
bool exit = 0;
int x;
int one ,two,five;
scanf("%d",&x);
for (one = 1;one < x*10;one ++){
? ? for (two = 1;two <x*10/2;two ++){
? ? ? for (five = 1;five <x*10/5;five ++){
? ? ? if(one + two*2+five *5 == x*10){
? ? ? printf("可以用%d個(gè)1角加%d個(gè)2角加%d個(gè)5角得到%d元\n",one,two,five,x);
? ? ? exit =1;
? ? ? break;
}
}
if (exit)
break;
? ? ? ? }
if (exit)
break;
}
return 0;
}
不常用的goto:用goto來(lái)跳出嵌套循環(huán)
# include<stdio.h>
int main ()
{
int x;
int one ,two,five;
scanf("%d",&x);
for (one = 1;one < x*10;one ++){
? ? for (two = 1;two <x*10/2;two ++){
? ? ? for (five = 1;five <x*10/5;five ++){
? ? ? if(one + two*2+five *5 == x*10){
? ? ? printf("可以用%d個(gè)1角加%d個(gè)2角加%d個(gè)5角得到%d元\n",one,two,five,x);
? ? ? goto out;
}
}
? ? ? ? }
}
out: return 0;
}
break vs continue
當(dāng)想要中止當(dāng)前循環(huán)時(shí),用 break,循環(huán)停止,執(zhí)行循環(huán)體后面的代碼。
continue 是跳過(guò)當(dāng)前循環(huán),執(zhí)行下一次循環(huán)。
辯證看待 goto
可以考慮使用goto的情形:1.從多重循環(huán)中直接跳出 ;2. 出錯(cuò)時(shí)清除資源; 3.可增加程序的清晰度的情況。
下列關(guān)于使用goto語(yǔ)句的原則可以供讀者參考。 1) 使用goto語(yǔ)句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里。 2) 使用goto語(yǔ)句在同一函數(shù)內(nèi)進(jìn)行g(shù)oto時(shí),goto的起點(diǎn)應(yīng)是函數(shù)內(nèi)一段小功能的結(jié)束處,goto的目的label處應(yīng)是函數(shù)內(nèi)另外一段小功能的開(kāi)始處。 3) 不能從一段復(fù)雜的執(zhí)行狀態(tài)中的位置goto到另外一個(gè)位置,比如,從多重嵌套的循環(huán)判斷中跳出去就是不允許的。 4)應(yīng)該避免像兩個(gè)方向跳轉(zhuǎn)。這樣最容易導(dǎo)致"面條代碼"。