阶乘
1.n! = 1×2×3×4×...×n
2.写出一个程序,让用户输入n,然后计算输出n!
3.变量:显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的i
intn;
scanf("%d",&n);
intfact=1;
inti=1;
for( i=1;i<=n; i++){
fact*=i;
}
printf("%d!=%d\n",n,fact);
5.1 for循环(第三种循环)
for循环像是一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定 步进 进行调整,比如加一或者减一
例如:
for(i=0;i<5;i++){
printf("%d",i);
}
for(初始动作;条件;每轮的动作){
}
//for中的每一个条件都是可以省略的,for(;条件;) == while(条件)
for = 对于
for(count = 10; count > 0; count-- )
可以解读成:对于一开始的count = 10,当count > 0的时候,重复做循环体,每一轮循环在做完循环体内语句后,使得count--
小套路
做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为1
循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,我们可以把变量i的定义写到for语句里面去
尝试(try)
- 1×1还是1,所以程序的循环需不需要从1开始,那么改成多少开始合适呢?这样修改之后,程序对于所有的n都正确吗?这样的改动有价值吗?
- 除了可以从1乘到n来计算n!,还可以从n乘到1来计算吧?试试换个方向来计算n。这时候,还需要循环控制变量i吗?
for == while
for( inti=1;i<=n;i++ ){
fact*=i;
}
-------------------------------------------
inti=1;
while(i<=n){
fact*=i;
i++;
}
循环次数
for( i = 0; i < n; i++)
这样循环的次数是n,而循环次数结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断 i
Tips for Loops(小贴士循环)
- 如果有固定次数,用for
- 如果必须执行一次,用 do while
- 其他情况用while
5.2循环控制
素数
只能被1和自身整除的数,不包括1
break VS continue
- break:跳出循环
- continue:跳过循环这一轮剩下的语句进入下一轮
- 都只能对它所在的那层循环生效
嵌套的循环
- 意思:循环的里面还是循环
- 嵌套循环时的break只会跳出当前所在的循环,如果嵌套了多层循环就会被卡在下一层循环上而无法真正的跳出所有循环
100以内的素数
如何写程序输出100以内的素数?
#include
intmain()
{
intx;
//我们需要有一个循环,从 1 到 100
for(x=2; x<=100; x++){
inti;
intisPrime=1; // x是素数
for ( i=2; i<x; i++ ) {
if ( x%i==0 ) {
isPrime=0;
break;
}
}
//当它是素数的时候就输出出来,不是素数就不要输出任何东西了
if ( isPrime==1 ) {
printf("%d ", x);
}
}
return0;
}
凑硬币
如何用1角、2角和5角的硬币凑出10元以下的金额?
#include
intmain()
{
intx;
intone, two, five;
intexit=0;
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个1角加%d个2角加%d个5角得到%d元\n",
one, two, five, x);
exit=1;
break;
}
}
if ( exit==1 ) break;
}
if ( exit==1 ) break;
}
return0;
}
5.3循环应用
正序分解整数
- 输入一个非负整数,正序输出它的每一位数字
- 输入:13425
- 输出:1 3 4 2 5
分解整数输出(未解决结尾空格问题版本)
intx;
scanf("%d",&x);
do{
intd=x%10;
printf("%d",d);
x/=10;
}while( x>0);
printf("\n");
//(未解决结尾空格问题版本)
-----------------------------------------
intx;
scanf("%d",&x);
do{
intd=x%10;
printf("%d",d);
if( x>9){
printf(" ");
}
x/=10;
}while( x>0);
printf("\n");
-----------------------------------------------
(如果有一个mask的话)
intx;
scanf("%d",&x);
x=13425;
intmask=10000;
do{
intd=x%10;
printf("%d",d);
if( x>9){
printf(" ");
}
x%=mask;
mask/=10;
}while( mask>0);
printf("\n");
---------------------------------------------------
// (计算x的位数)
x=12345;
intmask=10000;
intn=0;
do{
x/=10;
n++;
}while( x>0);
printf("n = %d\n",n);
求最大公约数
- 输入两个数a和b,输出它们最大的公约数
- 输入:12,18
- 输出:6
- 枚举方法:过于麻烦,耗费较多资源
#include
intmain()
{
inta,b;
intmin;
scanf("%d %d", &a, &b);
if ( a<b ) {
min=a;
} else {
min=b;
}
intret=0;
inti;
for ( i=1; i<min; i++ ) {
if ( a%i==0 ) {
if ( b%i==0 ) {
ret=i;
}
}
}
printf("%d和%d的最大公约数是%d.\n", a, b, ret);
return0;
}
辗转相除法
- 如果b等于0,计算结束,a就是最大的公约数;
- 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
- 回到第一步
inta,b;
intt;
scanf("%d %d",&a,&b);
intoriga=a;
intorigb=b;
while( b!=0 ){
t=a%b;
a=b;
b=t;
}
printf("%d和%d的最大公约数是%d",orida,origb,a);