C语言第二天03
1.for循环
阶乘 n!=1x2x3x4x…xn
写一个程序,让用户输入n,然后计算输出n!
变量:
显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的i
for循环就像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1
for(int i = 0 ;i<5 ;i++){
printf("%d",i);
}
1.1小套路
做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为1
循环控制变量i只在循环里被使用了,循环外面他没有任何用处。因此,我们可以把变量i的定义写道for语句里面去
2.循环的计算和选择
2.1循环次数
for==while
for(i=0;i<n;i++)
则循环的次数是n;而循环结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i<n还是判断i<=n,对循环的次数,循环结束后变量的值都有影响
2.2for循环
for(初始动作;条件;每轮的动作){
}
for中的每一个表达式都是可以省略的
for(;条件;)==while(条件)
2.3 Tips for loops
如果有固定次数,用for
如果必须执行依次,用do_while
其他情况用while
3.循环控制
3.1求素数
#include<stdio.h>
int main(){
int x;
scanf("%d",&x);
int i;
int isPrime = 1; //x是素数
for(i=2; i<x; i++){
if( x % i == 0){
isPrime=0;
break;
}
}
if(isPrime == 1){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
3.1break 和continue的区别
break:跳出循环
continue:跳过循环这一轮剩下的语句进入下一轮
4.嵌套的循环
如何写程序输出50个素数?
#include<stdio.h>
int main(){
int x=2;
int index=1;
while(index<50){
//TODO
int isPrime = 1;
int i;
for(i=2;i<x;i++){
if(x%i == 0){
isPrime = 0;
break;
}
}
if (isPrime == 1){
printf("%d ",x);
index++;
}
x++;
}
return 0;
}
循环里面还是循环
5.从嵌套的循环中跳出
凑硬币:如何用1角,2角和5角的硬币凑出10元以下的金额呢?
#include<stdio.h>
int main(){
int x;
int one, two ,five;
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++){
//TODO
if( one + two*2 + five *5 == x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
}
}
}
}
return 0;
}
5.1break和continue
只能对它所在的那层循环做
5.2接力break
#include<stdio.h>
int main(){
int x;
int one, two ,five;
int exit = 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++){
//TODO
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 ) break;
}
if ( exit ) break;
}
return 0;
}
5.3 goto
#include<stdio.h>
int main(){
int x;
int one, two ,five;
int exit = 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++){
//TODO
if( one + two*2 + five *5 == x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
goto out;
}
}
if( exit ) break;
}
if ( exit ) break;
}
out:
return 0;
}
6.前n项求和
求f(n)=1-1/2+1/3-1/4+1/5-1/6+…+n;
#include<stdio.h>
int main(){
int n;
double sum=0;
scanf("%d",&n);
//int sign = 1;
double sign = 1.0;
for(int i = 1; i<=n; i++){
sum+=sign/i;
sign = -sign;
}
printf("f(%d)=%.2f\n",n,sum);
return 0;
}
7.整数分解
#include<stdio.h>
int main(){
int x,t;
scanf("%d",&x);
t=x;
// 13245/10000 ->1
// 13245%10000 ->3245
// 10000/10 ->1000
// 3245/1000 ->3
// 3245%1000 ->245
// 1000/10 ->100
// 245/100 ->2
// 245%100 ->45
// 100/10 ->10
// 45/10 ->4
// 45%10 ->5
// 10/10 ->1
// 5/1 ->5
// 5%1 ->0
// 1/10 ->0
int mask = 1;
while(t>10){
//TODO
t/=10;
mask*=10;
}
do{
int d = x/mask;
printf("%d",d);
if( mask >0){
printf(" ");
}
x%=mask;
mask/=10;
}while(mask>0);
return 0;
}
8.最大公约数
输入俩个数a和b,输出他们的最大公约数
输入:12 18
输出:6
8.1辗转相除法
1.如果b等于0,计算结束,a就是最大公约数
2.否则,计算a除以b的余数,让a等于b,而b等于那个余数
3.回到第一步
a 12 18 12 6
b 18 12 6 0
#include<stdio.h>
int main(){
// 方法1
// int sum=1;
// for(int i =1; i<=27; i++){
// if(27%i==0&&128%i==0){
// sum=i;
// }
// }
// printf("%d",sum);
// 方法2
int m,n,t;
scanf("%d%d",&m,&n);
while(n!=0){
//TODO
t=m;
m=n;
n=t%n;
}
printf("gcd=%d",m);
return 0;
}