本週學到了什麼
在本週的學習中,對遞歸有了一點基礎的瞭解、學會了大數取餘的方法、掌握了取冪的快速求法。
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道題。