【藍橋杯學習記錄】【5.2】整數的基本性質與運用(2)真題

求第100002(十萬零二)個素數

數組太大 放在棧裏是不夠的 要麼定義全局變量 要麼放在堆裏,通過指針建立動態數組

注意篩法的原理和運用

標題:買不到的數目

標題:高僧鬥法問題(尼姆遊戲)

#include <iostream>
#include <cstdio>
#include <string.h>
#include <iomanip>
#include <math.h>
#include <stdlib.h>
#include <algorithm>

#define PI atan(1.0)*4

using namespace std;

bool isprime(int m)
{
	int i, k = sqrt(m);
	for(i = 2; i <= k; i++)
		if(m % i == 0) break;
	if(i >= k+1)
		return 1;
	else
		return 0;
	
} 
int main()
{	
/**-----------------------------------------------------------------------------**/
/**-----------------------------------------------------------------------------**/
/**-----------------------------------------------------------------------------**/
/*
	素數就是不能再進行等分的整數。比如:7,11。而9不是素數,因爲它可以平分爲3等份。一般認
	爲最小的素數是2,接着是3,5,…
	請問,第100002(十萬零二)個素數是多少?
	請注意:2是第一素數,3是第二個素數,依此類推
*/  
	//cout << isprime(4) << endl;
/*
	for(int i = 0, j = -2;;i++)
	{
		if(isprime(i))
			j++;
		if(j == 100002)
		{
			cout << i ;//15485917
			break;
		}
	}
*/

/**-----------------------------------------------------------------------------**/
	/*
	篩法:
	2* 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
---->篩除2的倍數 
	2  3*. 5 . 7 . 9 .  11 .  13 .  15 .  17 .
---->篩除3的倍數 
	2  3 . 5*. 7 . . .  .  .  .  .  .  .  17 .
	*/
	/**/
	int N = 1000 * 1000 * 10;
	int x = 100002;
	int* a = new int[N];//放在堆上 分析在下面 
	for(int i = 2; i < N/2; i++)
	{
		if(a[i] == 1) continue;
		//和數沒有資格參加篩法 
		for(int k = 2; k <= N/i; k++)
			if(i * k < N)
				a[i*k] = 1;
	}
	int m = 0;
	for(int i = 2; i < N; i++)
	{
		if(a[i] == 0)
		{
			m++;
			if(m == x)
				cout << i << " " << endl;	
		}
	}	
/* 
	1000000=1000*1000然後乘以int型數據長度

	1000*1000*4byte約等於4M,

	而棧的默認內存空間爲1M左右,所以會導致內存溢出

	解決這個問題,可以將數組申明在全局存儲區或堆上即可

	方法一:申明爲全局變量

	方法二:存放在堆上 (就是上邊的用指針實現動態數組的方法) 
*/
	
/**-----------------------------------------------------------------------------**/
/**-----------------------------------------------------------------------------**/
/**-----------------------------------------------------------------------------**/

	/**標題:買不到的數目**/
/*
	小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。
	
	小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買
10顆糖。
	
	你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可
以用4和7組合出來。

	本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字
	
輸入:
	兩個正整數,表示每種包裝中糖的顆數(都不多於1000)

要求輸出:
	一個正整數,表示最大不能買到的糖數
	
	例如
*/
	//搜索連續能夠買到的糖果數 達到最小包裝數 就可以
	//因爲連續能買到最小包裝數的了,下一個只需要從開始連續的地方加上最小包裝數 
	//就是現在下一個需要買的數目了 
	
	//同樣是先建立一個大數組 遍歷一遍能買到的標爲1 不能買到的標爲0 
	//遍歷數組 如果連續a次出現,就返回i-a。(因爲是問的最大不能買到,所以要倒回去)
	
	/**高僧鬥法問題**/
	/*
	古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有“高僧鬥法”的趣味節目,以舒緩壓抑
	的氣氛
	節目大略步驟爲:先用糧食(一般是稻米)在地上“畫”出若干級臺階(表示N級浮屠)。又有若
	幹小和尚隨機地“站”在某個臺階上。最高一級臺階必須站人,其它任意。(如圖1所示)
	兩位參加遊戲的法師分別指揮某個小和尚向上走任意多級的臺階,但會被站在高級臺階上的小和尚
	阻擋,不能越過。兩個小和尚也不能站在同一臺階,也不能向低級臺階移動
	兩法師輪流發出指令,最後所有小和尚必然會都擠在高段臺階,再也不能向上移動。輪到哪個法師
	指揮時無法繼續移動,則遊戲結束,該法師認輸
	對於已知的臺階數和小和尚的分佈位置,請你計算先發指令的法師該如何決策才能保證勝出
	輸入數據爲一行用空格分開的N個整數,表示小和尚的位置。臺階序號從1算起,所以最後一個小和
	尚的位置即是臺階的總數。(N<100,臺階總數<1000)
	
	例如:
	用戶輸入:
	1 5 9
	則程序輸出:
	1 4
	
	再如:
	用戶輸入:
	1 5 8 10
	則程序輸出:
	1 3
	*/ 
	
	/*
	所有這類的博弈問題都可以歸結爲尼姆遊戲。Nimm
	
	若干堆硬幣,2人輪流取
	3 4 5
	
	  1 1
	1 0 0
	1 0 1
	-----
	2 1 2
	
	這裏考慮:如何把本問題轉化爲尼姆遊戲問題。
	
	兩兩連續分在一組:
	若偶數
	(a1a2)(b1b2)
	若奇數
	(a1a2)(b1b2)(x|)
	考慮每個組的間隔,可以轉化爲尼姆問題。
	*/
	return 0;
}





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