求第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;
}