一、for循环
1、阶乘
(1)、有左右两种结构可以表达。
int n;
scanf ("%d",&n);
int fact = 1;
int i = 1;
for (i=1;i<=n;i++) { while (i<=n) {
fact *= i;
fact *= i; i ++;
} }
printf ("%d!=%d\n",n,fact);
(2)、for的括号中的语句: 初始动作;循环继续的条件;循环每一轮要做的条件。(表达式还可以省掉一个){注意格式}
int n;
scanf ("%d",&n);
int fact = 1;
int i = n;
for (;n>0;n--) {
fact *=n;
}
printf ("%d!=%d\n",i,fact);
2、循环的计算与选择
不同的初始化和条件导致输出的结果和过程有所不同。
当用while循环时,结果一致,过程略有不同。
注:for(;条件;) == while(条件)
3、如何选择循环语句?
(1)、有固定次数,用for;
(2)、必须执行一次,用do-while;
(3)、其他情况用while。
二、循环控制
1、用break和continue来控制循环。
(1)、区别:break:跳出循环;
continue:跳过循环这一轮剩下的语句进入下一轮。
(2)、break的应用:
int x;
scanf ("%d",&x);
int i;
int isPrime=1;
for (i=2;i<x;i++){
if (x%i==0){
isPrime=0;
break;
}
}
if (isPrime==1){
printf ("是素数。");
}else {
printf ("不是素数。");
}
2、嵌套的循环
(1)、输出一百以内的素数。
int x;
for (x=2;x<100;x++)
{
int isPrime=1;
int i;
for (i=2;i<x;i++)
{
if (x%i==0)
{
isPrime=0;
break;
}
}
if (isPrime==1)
printf ("%d\n",x);
}
(2)、输出五十个素数。
需要一个计数器,也可以用while循环来做。
int x;
int cnt=0
for (x=2;cnt<100;x++) //while(cnt<50)
{
int isPrime=1;
int i;
for (i=2;i<x;i++)
{
if (x%i==0)
{
isPrime=0;
break;
}
}
if (isPrime==1)
{
printf ("%d\n",x);
cnt++;
}
//x++
}
3、从嵌套的循环中跳出来。
int x;
scanf ("%d",&x);
int one,two,five;
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个1角、%d个2角和%d个5角得到%d元。\n",one,two,five,x);
}
}
}
}
注: break和continue只能对它所在的那层循环做。
(1)、break接力
int x;
scanf ("%d",&x);
int one,two,five;
int exit=0;
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个1角、%d个2角和%d个5角得到%d元。\n",one,two,five,x);
exit=1;
break;
}
}
if(exit==1) break;
}
if(exit==1) break;
}
(2)、goto(从多种循环中跳出来)
int x;
scanf ("%d",&x);
int one,two,five;
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个1角、%d个2角和%d个5角得到%d元。\n",one,two,five,x);
goto out;
}
}
}
}
out:
三、前n项求和
1、求f(n)=1+1/2+1/3+1/4……+1/n
int n;
scanf ("%d",&n);
int i;
double sum=0.0;
for ( i=1; i<=n; i++)
{
sum += 1.0/i;
}
printf ("f(%d)=%lf\n",n,sum);
2、求f(n)=1-1/2+1/3-1/4……+1/n
int n;
scanf ("%d",&n);
int i;
double sum=0.0;
double sign=1.0;
for ( i=1; i<=n; i++)
{
sum += sign/i;
sign = -sign;
}
printf ("f(%d)=%lf\n",n,sum);
四、求最大公约数
1、枚举法
int a,b;
scanf ("%d %d",&a,&b);
int min;
if (a>b)
min=b;
else
min=a;
int i;
int ret=0;
for (i=1; i<min; i++)
{
if (a%i==0)
{
if(b%i==0)
{
ret=i;
}
}
}
printf ("%d和%d的最大公约数是%d。",a,b,ret);
2、辗转相除法
/*
如果b等于0,计算结束,a就是最大公约数;
否则,计算a除以b的余数,让a等于b,而b等于那个余数;
回到第一步。
例:
a b t
12 18 12
18 12 6
12 6 0
6 0
*/
int a,b;
scanf ("%d %d",&a,&b);
int t;
while (b!=0)
{
t=a%b;
a=b;
b=t;
}
printf("gcd=%d\n",a);
五、分解整数
1、要求:输入一个非负整数,正序输出它的每一位数字。
例:输入:13425;输出:1 3 4 2 5。
int x;
scanf ("%d",&x);
int a=x;
int mask=1;
while (a>=10)
{
a/=10;
mask*=10;
}
printf ("mask=%d\n",mask);
do
{
int d=x/mask;
printf("%d",d);
if (mask>=10)
{
printf (" ");
}
mask/=10;
x%=mask;
}while (mask>0);