学习有关for语句使用实例:找符合要求的数,国王的小麦,判定素数;
一:找符合要求的数
例。输出100~999中所有个位和百位之和为9的整数;
分析:将范围定在100~999之间,依次检查每个数是否符合条件,循环体只需分解整数,得到各位和百位,判断相加是否为9;
即
#include <stdio.h>
int main()
{
int a,b,i;
for(i=100;i<=999;i++)
{
a=i%10;
b=i/100%10;
if(a+b==9)
{
printf("%7d",i);
}
}
return 0;
}
二:国王的小麦
在国际象棋的棋盘第1格内放1粒麦子,第2格内放2粒麦子,第3格内放4粒麦子,以后每一格是前一格的一倍,一直放到第64格,问一共需多少麦子?
分析:我们需计算出每一格的小麦数量,累加得到总数,变量需控制在1~64之间,后一格的总数是前一格的两倍,即:a=a*2;total=total+a;
注意:因为在本题中最后小麦数是一个极大的数所以int不足以表示,应该用double类型(注意double对映的是lf);
即:
#include <stdio.h>
int main()
{
int i=1;
double a=1,total=0;
for(i=1;i<=64;i++)
{
total=total+a;
a=a*2;
printf("i=%d,total=%.0lf\n",i,total);
}
return 0;
}
三:判定素数
判断一个数m是否是素数,需要判断2~(m-1)之间的整数是否能被m整除;
设置标志flag;若flag=1,则是素数;若flag=0则不是素数,令flag初值为1.
#include <stdio.h>
int main()
{
int i,m,flag=1;
printf("Input a postive integer: \n");
scanf("%d",&m);
for(i=2;i<=m-1;i++)
if(m%i==0)
flag =0;
if(flag== 1 )
printf("%d is a prime\n", m);
else
printf("%d is not a prime\n",m);
return 0;
}
这种方法会判断2~m-1之间的所有数,但实际上只需判断有一个即可;
跳出循环——break
break不仅可在switch语句中使用也可以在循环中使用,表示从循环体中跳出,提早结束循环。
所以这样就可以不用使用flag标记了,提高了效率。
#include <stdio.h>
#include <math.h>
int main()
{
int i,m,k;
printf("Input a postive integer: \n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
break;
if(i<=k)
printf("%d is not a prime\n", m);
else
printf("%d is a prime\n",m);
return 0;
}
如果i是m的因了,m/i=j,j也是m的因子可以缩小范围:2~√m
在上方代码中,如果m能被 i 整除则会提前跳出循环就会是i的值小于k从而判断。