17.09.24周結

本週學到了什麼

在本週的學習中,對遞歸有了一點基礎的瞭解、學會了大數取餘的方法、掌握了取冪的快速求法。

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道題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章