2023-2024-1 学号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的学习
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 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小时