第二十一篇:循环语句while
while循环
首先判断while后面的表达式的值,若表达式的值为真,则执行while的内嵌语句(即循环体)一次;然后重复以上过程,直到表达式的值为假时,才退出循环,接着执行循环体语句后面的其它程序语句。
//求恰好使s=1/1+1/2+1/3+…+1/n的值大于10时n的值
#include<iostream>
using namespace std;//命名空间
int main()
{
double s = 0;//结果
int n = 0;//除数
while(s <=10)//这个while中条件为true为真就始终执行
{
n++;//这个给被除数
s+=1.0/n;//这个为总数
}
cout<<"n="<<n<<endl;//输出
return 0;
}
do-while循环
首先执行do-while的内嵌语句(循环体语句)一次,然后再判断while后面的表达式的值,若表达式的值为真,则重复执行do-while的内嵌语句,如此反复,直到表达式的值为假时,循环结束,执行while后面的语句。
//求两个正整数m和n的最大公约数
/*对于52317和75569两个数,你能迅速地求出它们的最大公约数吗?
先用较大的75569除以52317,得商1,余数23252,再以52317除以23252,得商2,余数是5813,
再用23252做被除数,5813做除数,正好除尽得商数4。
这样5813就是75569和52317的最大公约数。*/
#include<iostream>//Euclid方法
using namespace std;
int main()
{
int a0,a1,r;//定义三个整数
cin>>a0>>a1;//
do
{
r=a0%a1;
cout<<"Start:"<<a0<<" "<<a1<<" "<<r<<endl;
a0=a1;
a1=r;
cout<<"End:"<<a0<<" "<<a1<<" "<<r<<endl;
}while(r!=0);
cout<<"最大公约数:"<<a0<<endl;
return 0;
}
/*比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1
我们当然也可以把上面这个式子改写成乘法式:a=bq1+r1------①
如果r1=0,那么b就是a、b的最大公约数3。
要是r1≠0,就继续除,用b除以r1,
我们也可以有和上面一样的式子:b=r1q2+r2-------②
如果余数r2=0,那么r1就是所求的最大公约数3。
为什么呢?因为如果②式变成了b=r1q2,那么b1r1的公约数就一定是a1b的公约数。
a÷b=q1…r1
a=bq1+r1
b÷r1=q2…r2
b=r1q2+r2
b=r1q2(公因数自己领悟吧,呵呵)
r1÷r2=q3…r3
r1=r2q3
这是因为一个数能同时除尽b和r1,那么由①式,就一定能整除a,从而也是a1b的公约数。
反过来,如果一个数d,能同时整除a1b,那么由①式,也一定能整除r1,从而也有d是b1r1的公约数。
这样,a和b的公约数与b和r1的公约数完全一样,那么这两对的最大公约数也一定相同。
那b1r1的最大公约数,在r1=0时,不就是r1吗?所以a和b的最大公约数也是r1了。
有人会说,那r2不等于0怎么办?那当然是继续往下做,用r1除以r2,……直到余数为零为止。
在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。?*/