本周学到了什么
在本周的学习中,对递归有了一点基础的了解、学会了大数取余的方法、掌握了取幂的快速求法。
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道题。