- n! = 1 * 2 * 3 * 4 * 5 * …* n
- 写一个程序,让用户输入n,然后计算输出n!
- 变量:
- 显然读用户的输入需要一个int 的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的i
int n;
scanf("%d",&n);
int fact=1;
int i=1;
while(i<=n){
fact *= i;
i++;
}
printf("%d!=%dn",n,fact);
可以使用for语句,改良为
int n;
scanf("%d",&n);
int fact=1;
int i;
for(i=1;i<=n;i++){
fact *= i;
}
printf("%d!=%dn",n,fact);
for(初始动作;循环继续的条件;循环每轮要做的事情)
for循环 for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1
for(i=0;i<5;i=i+1){
printf("%d",i);
}
for = 对于
- for(count=10;count>0;count–);
- 就读成:“对于一开始的count=10,当count>0时,重复做循环体,每一轮循环在做完循环体内语句后,使得count–。”
- 做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为1
- 循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,外面可以把变量i的定义写到for语句里面去
int n;
scanf("%d",&n);
int fact=1;
for(int i=1;i<=n;i++){
fact *= i;
}
printf("%d!=%dn",n,fact);
(只有c99才能用!)
try- 1*1还是1,所以程序的循环不需要从1开始,那么改成从多少开始合适呢?这样修改之后,程序对所有的n都正确吗?这样的改动有价值吗?
- 除了可以从1乘到n来计算n!,还可以从n乘到1来计算吧?试试把循环换个方向来计算n。这时候,还需要循环控制变量i吗?
int n;
scanf("%d",&n);
int fact=1;
int i=n;
//for(int i=1;i<=n;i++){
// fact *= i;
//}
for(;n>1;n--){
fact *= n;
}
printf("%d!=%dn",i,fact);
5.1.2循环的计算和选择
循环次数
- for(i=0;i
- 则循环的次数是n,而循环结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i
- 则循环的次数是n,而循环结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i
for(int i=1;i<=n;i++){
fact *= i;
}
等价于
int i=1;
while(i<=n){
fact *=i;
i++;
}
for循环
for(初始动作;条件;每轮的动作){ }
- for中的每一个表达式都是可以省略的
- for(;条件;) == while(条件)
for循环
while循环
do-while循环
Tips for loops- 如果有固定次数,用for
- 如果必须执行一次,用do-while
- 其他情况用while
- 只能被1和自己整除的数
- 2,3,5,7,11,13,17,19······
- break:跳出循环
- continue:跳过循环这一轮剩下的语句进入下一轮
int x;
scanf("%d",&x);
int i;
int isPrime=1;
for(i=2;i
5.2.2嵌套的循环
100以内的素数
- 如何写程序输出100以内的素数?
int x;
for(x=2;x<=100;x++){
int i;
int isPrime=1;
for(i=2;i
嵌套的循环
- 循环里面还是循环
输出前50个素数
int x;
int cnt=0;
for(x=2;cnt<50;x++){
int i;
int isPrime=1;
for(i=2;i
5.2.3从嵌套的循环中跳出(离开多重循环)
凑硬币
- 如何用1角、2角和5角的硬币凑出10元以下的金额呢?
int x;
int one,two,five;
scanf("%d",&x);
for(one=1;one
break和continue
- 只能对它所在的那层循环做
接力break
int x;
int one,two,five;
int exit=0;
scanf("%d",&x);
for(one=1;one
goto
int x;
int one,two,five;
scanf("%d",&x);
for(one=1;one
5.3.1求和-前n项求和
int n;
int i;
double sum=0.0;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum += 1.0/i;
}
printf("f(%d)=%fn",n,sum);
return 0;
int n;
int i;
double sum=0.0;
int sign=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum += sign*1.0/i;
sign=-sign;
}
printf("f(%d)=%fn",n,sum);
return 0;
5.3.2整数分解
正序分解整数
- 输入一个非负整数,正序输出它的每一位数字
- 输入:13425
- 输出:1 3 4 2 5
int x;
scanf("%d",&x);
int t=0;
do{
int d=x%10;
t=t*10+d;
x/=10;
}while(x>0);
printf("x=%d,t=%dn",x,t);
x=t;
do{
int e=x%10;
printf("%d",e);
if(x>9){
printf(" ");
}
x/=10;
}while(x>0);
printf("n");
return 0;
但是当x最后一位为0时,会被省略,如700,输出为7
改进版:
int x;
scanf("%d",&x);
int mask=1;
int t=x;
while(t>9){
t/=10;
mask*=10;
}
printf("x=%d,mask=%dn",x,mask);
do{
int d=x/mask;
printf("%d",d);
if(mask>9){
printf(" ");
}
x%=mask;
mask/=10;
}while(mask>0);
printf("n");
return 0;
5.3.3求最大公约数
求最大公约数
- 输入两个数a和b,输出它们的最大公约数
- 输入:12 18
- 输出:6
枚举
- 设t为2;
- 如果u和v都能被t整除,则记下这个t;
- t加1后重复第2步,直到t等于u或v;
- 那么,曾经记下的最大的可以同时整除u和v的t就是gcd。
int a,b;
int min;
scanf("%d %d",&a,&b);
if(a
辗转相除法
- 如果b等于0,计算结束,a就是最大公约数;
- 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
- 回到第一步。
int a,b;
int t;
scanf("%d %d",&a,&b);
while(b!=0){
t=a%b;
a=b;
b=t;
printf("a=%d,b=%d,t=%dn",a,b,t);
}
printf("gcd=%dn",a);
return 0;



