栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言学习-翁凯(第五章笔记)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言学习-翁凯(第五章笔记)

C语言学习-翁凯-第五章 第五章 5.1.1for循环 阶乘
  • 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
for == while
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
5.2.1循环控制 素数
  • 只能被1和自己整除的数
    • 2,3,5,7,11,13,17,19······
break vs continue
  • 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
枚举
  1. 设t为2;
  2. 如果u和v都能被t整除,则记下这个t;
  3. t加1后重复第2步,直到t等于u或v;
  4. 那么,曾经记下的最大的可以同时整除u和v的t就是gcd。
int a,b;
int min;

scanf("%d %d",&a,&b);
if(a 
辗转相除法 
  1. 如果b等于0,计算结束,a就是最大公约数;
  2. 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
  3. 回到第一步。
	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;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/298163.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号