欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

暑假学习部分总结

程序员文章站 2022-05-10 11:02:19
...

7月22日 暑假学习部分总结。
看样子要想把基础复习一边还需要点时间,已经四天了,应该还需要两天吧,或许更多。
一,难点或者是易混淆的点
1,主对角线很明显是i=j。副对角线是i+j等于n;
2,杨辉三角可以将金字塔形状的转化为直角三角形,也就是线性代数里面的下三角。以后做题时也要将图形进行变换。
3,goto L时,记得中间不允许有变量被定义。
4,在,cmath头文件下,不允许有全局变量y1,j1等,因为这是一个定义过的函数,但是在main里面写作为局部变量。
5,gets读取的是一整行,而puts自己就有一个换行符。
6,strlwr是将字符串中的大写字母改成小写字母,strupr相反。(第一次见这两个函数)
7,如果在某个主调函数里面声明了函数原型,那函数只能在这个主调函数里面使用。
8*函数的调用过程实际上是对栈空的操作过程,因为调用函数是使用栈空间来保存信息。回复主调函数的运行状态,释放被调用函数的栈空间,按其返回地址返回到调用函数。
9,辗转相除法需要用到高精度除法,而二进制公约数算法只用到除二和减法精度更高,而且时间更少。底下第4个题就是二进制最大公约数算法。(像什么短除法,更相易损法,就不在这里提了,网上都有。)

*二,有价值的题。
1,约瑟夫问题(Josephu)常见的变例有猴子选大王,持密码报数,狐狸追兔子问题。
题意,有n个人围成一圈,从第一个开始报数,报道m的人出列,求出列的顺序。
(注意每次这个人出列了,是从这个肉的下一个人开始从一报数。)
while(i1<=n)
{
i2++;
if(i2=(=)n+1) i2=1;
if(a[i2](=)=0) i3++;
if(i3==m)
{
i3=0;
cout<i2;
a[i2]=1;i1++;}}

2,质数筛法,原理就是如果这个数是质数那这个数的倍数一定不是质数,如果当前这个数已经被标记过不是质数了,那就不用操作了。
for(i1=2;i1<=sqrt(n);i1++)
{
if(a[i1])
for(j=2;j<=n/i;j++) a[i1*i2]=0;}
注意(1)一重循环是从2开始。(2)一重循环截止到根号下n。(3)二重循环是在if里面,不是if在二重循环里面。

3,蛇形填充把我自己写的代码和题解放了出来也不难,但是题解就写的太好了。(放到最后了,有兴趣的小伙伴可以看一看。)
4,
int gcd(int m,int m)
{
if(m=(=)n) return m;
if(m<n) return gcd(n,m)
if(m%2=(=)0)
{
if(n%2==0) return 2*gcd(m/2,n/2);
else return gcd(m/2,n);
}
else {
if(n%2=0) return gcd(m,n/2);
else return gcd(n,m-n);}}


简单说一下,如果两者都是偶数就返回2*两者的公因数,如果都是奇数,就返回n和m-n,如果一个奇一个偶,就返回偶数除2和奇的公约数,相同就退出。

5,有n个数在数组中,要求判断找出k个数,这k个数的和是m。
这个题是个典型的递归。分析问题不难看出,对于每一个数都有两种可能加上这个数是和等于m或者是不加这个数和等于m。
如果不加这个数和等于m的话,也就是从剩下的n-1个数中找出k个数组成m。
如果加上这个数等于m的话,就是剩下的n-1个数中找出k个数来组成m-a[i]。
void sum (int n,int m)
{
if(a[n]=m) flag=true;
else if(n==1) break;
else {
sum(n-1,m-a[n]);
sum(n-1,m);
}
}
(看会有黄色的标记,也不知道怎么回事,好像是格式有问题?显示不出来吗?两个等号就会出现黄色标记,我改成了(=)=了,读者请注意。)

相关标签: 笔记