2023-2024-1 学号20231318《计算机基础与程序设计》第十三周学习总结

发布时间 2023-12-24 08:35:22作者: 20231318傅述令

作业信息

这个作业属于哪个课程 2023-2024-1-计算机基础与程序设计
这个作业要求在哪里 2023-2024-1计算机基础与程序设计第十三周作业
这个作业的目标 自学教材《C语言程序设计》第12章并完成云班课测试。
作业正文 2023-2024-1 学号20231318《计算机基础与程序设计》第十三周学习总结

教材学习内容总结

《C语言程序设计》第十二章:

主要介绍了

  • 基本数据类型到抽象数据类型

  • 结构体(定义结构体类型的原因,结构体变量的定义,用typedef定义数据类型,结构体变量的初始化,嵌套的结构体,结构体变量的引用,结构体所占内存的字节数)

  • 结构体数组的定义和初始化,结构体指针的定义和初始化(指向结构体变量的指针、指向结构体数组的指针)

  • 向函数传递结构体(变量、数组、指针)

  • 共用体

  • 枚举数据类型

  • 动态数据结构————单向链表(定义、建立、删除和插入操作)。

  • 同时,第12章还拓展了其他一些内容,栈和队列,树和图,数据的逻辑结构和存储结构。

教材学习中的问题和解决过程

   问题:C语言中求最大公约数的算法?
	解决过程:在CSDN和博客园上寻找教程解决了问题。

 相关文章:求最大公约数(辗转相除法)
  辗转相除法又叫欧几里得算法,是欧几里得最先提出来的.
  辗转相除法的实现,是基于下面的原理(在这里用(a,b)表示a和b的最大公因数):
(a,b)=(a,ka+b),其中a、b、k都为自然数.………………①
  也就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2.要证明这个原理很容易:如果p是a和ka+b的公约数,p整除a,也能整除ka+b.那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的.
  基于上面的原理,就能实现我们的迭代相减法:

	(78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2

  基本上思路就是大数减去小数,一直减到能算出来为止,在作为练习的时候,往往进行到某一步就已经可以看出得值.迭代相减法简单,不过步数比较多,实际上我们可以看到,在上面的过程中,由(78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法.
 用辗转相除法求(a,b).设r0=b,r1=a,反复运用除法算式,得到一系列整数qi,ri和下面的方程:
 相当于每一步都运用原理①把数字进行缩小,上面右边就是每一步对应的缩小结果,可以看出,最后的余数rn就是a和b的公约数.迭代相减法和辗转相除法在本质上是一样的,相对来说,减法比较简单(需要10步),但是除法步数少(仅需4步).

因此可以通过这个原理来求出最大公约数:

	#include<iostream>
	#include<cstdio>
	using namespace std;
	 
	int fun(int m,int n){
	int rem;			//余数,当余数为0的时候,最后的m即为最大公约数
	//先用较小的数对较大的数取余,再用余数对较小的数求余,直到余数为零 
	while(n > 0){
	rem = m % n;
	m = n;
	n = rem;
		}
	return m;			//将结果返回			
	}
	int main(){
	int n,m;
	cin>>m>>n;
	cout<<"m和n的最大公约数为:"<<fun(m,n)<<endl;
	return 0; 
	} 

因为到余数为零结束,所以还可以将程序简化一下用递归来求:

	int fun(int m,int n){
	if(n==0) return m;
	return fun(n,m%n);
	}

再简化一下,用一行代码来求:

	int gcd(int m, int n) {
	return n ? gcd(n, m % n) : m;
	}

————————————————
版权声明:本文为CSDN博主「晴空๓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41575507/article/details/90752742

基于AI的学习

image
image
image
image
image
image

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 10篇 300小时
第一周 200/200 1/1 28/28 学会了markdown语法
第二周 100/300 1/2 10/38 学会了使用chatgpt
第三周 150/450 1/3 15/53 学习运用c语言编写简单程序
第四周 150/600 1/4 20/73 学习运用C语言输出数学计算程序,熟悉门电路知识
第五周 120/720 1/5 13/86 学习运用基本的机器语言、汇编语言和伪代码
第六周 180/900 1/6 20/106 学习综合运用分支结构与循环结构
第七周 200/1100 1/7 14/120 学习运用跳转结构与调用函数
第八周 300/1400 1/8 13/133 学习运用一维和二维数组以及基本的指针用法
第九周 250/1650 1/9 18/151 学会了函数指针、指针与数组以及动态内存分配
第十周 350/2000 1/10 19/171 学习了字符串的运用,初步了解了结构体
第十一周 500/2500 1/11 19/190 学习了结构体与共用体,以及链表这一动态数据结构的运用
第十二周 1000/3500 1/12 20/210 学习了文件的概念和运用
第十三周 1000/4500 1/13 18/228 复习了C语言输出数学计算程序;还复习了指针、结构体和字符串

预计学习时间:25小时
实际学习时间:22小时

参考资料