17.09.24周结

来源:互联网 发布:和平网络电视手机安卓 编辑:程序博客网 时间:2024/06/16 14:25

本周学到了什么

在本周的学习中,对递归有了一点基础的了解、学会了大数取余的方法、掌握了取幂的快速求法。

1、递归

递归是一种满足条件下对自身的重复调用。像汉诺塔、超级台阶、全排列等等问题都是使用递归解决的。

下面编写一段使用递归解决超级台阶的问题

#include<cstdio>#include<iostream>using namespace std;int nums = 0;void fun(int n){if(n == 0){nums++;return;}else if(n <0){return;}int temp=n;fun(temp-1);fun(temp-2);}int main(){int Nums[41];for(int i = 0; i < 41; i++){nums = 0;fun(i);Nums[i] = nums-1; }int T;scanf("%d",&T);while(T--){int num;scanf("%d",&num);printf("%d\n",Nums[num]);}return 0;}


2、大数取余

当要对一个数值大于long long范围的数进行取余时可以先将其用C-风格字符串进行存储,在通过逐步叠加的过程中不断取余便可以得到结果

具体实现如下

//求一个数对10003取余的结果; #include<iostream>#include<cstdio>#include<cstring> using namespace std;int main(){char temp[] = "123456789123456";int len = strlen(temp);int result = 0;for(int i = 0; i < len; i++){result = (result*10+temp[i]-'0')%10003; } cout << result << endl;return 0; } 

3、快速取幂

要实现快速取幂,可以通过位运算进行求值。

具体实现如下

#include<iostream>#include<cstdio>using namespace std;long long POW(long long a, long long b, long long c){long long flag = a%c, result = 1;while(b != 0){if(b & 1){result = (result*flag)%c;}b = b >> 1;flag = (flag*flag)%c;}return result;}int main(){int T;cin >> T;long long a, b, c;while(T--){cin >> a >> b >> c;printf("%lld\n",POW(a, b, c));}return 0; } 


下周要学什么

下周准备争取时间将递归吃透,并在南阳理工OJ上AC20道题。

原创粉丝点击