pascal程式 選數,pascal程式設計 數字遊戲

時間 2022-02-05 15:45:06

1樓:匿名使用者

型別:搜尋

題解:本題動態規劃無從下手,也無數學公式可尋,看來只能搜尋(組合的生成演算法),其實1<=n<=20這個約束條件也暗示我們本題搜尋是有希望的,組合的生成可用簡單的dfs來實現,既搜尋這k個整數在原數列中的位置,由於組合不同於排列,與這k個數的排列順序無關,所以我們可以令a[i]1)是否為素數最簡單的方法就是看是否存在一個素數a(a<=sqrt(p))是p的約數,如果不存在,該數就為素數,由於在此題中1<=xi<=5000000,n<=20,所以要判斷的數p不會超過100000000,sqrt(p)<=10000,因此,為了加快速度,我們可以用篩選法將2…10000之間的素數儲存到一個陣列裡(共1229個),這樣速度估計將提高5~6倍。

特別注意:本題是要求使和為素數的情況有多少種,並不是求有多少種素數,比賽時就有很多同學胡亂判重而丟了12分;還有1不是素數,在判素數時要對1做特殊處理。

標程:pascal

program c2;

const

maxn = 20;

varn, m, i: byte;

ans, s: longint;

x: array[1 .. maxn] of longint;

f: array[1 .. 10000] of byte;

p: array[1 .. 1229] of integer;

procedure get_prime;

vari, j, s: integer;

begin

s := 0;

f[1] := 0;

for i := 2 to 10000 do f[i] := 1;

for i := 2 to 10000 doif f[i] = 1 then

begin

inc(s); p[s] := i;

j := 2 * i;

while j <= 10000 do begin f[j] := 0; inc(j, i) end;

endend;

procedure work(s: longint);

vari: integer;

begin

if s <= 10000 then inc(ans, f[s])else

begin

i := 1;

while sqr(longint(p[i])) <= s dobegin

if s mod p[i] = 0 then exit;

inc(i)

end;

inc(ans)

endend;

procedure search(d, pre: byte);

vari: byte;

begin

for i := pre + 1 to n - (m - d) dobegin

inc(s, x[i]);

if d = m then work(s)else search(d + 1, i);

dec(s, x[i])

endend;

begin

readln(n, m);

for i := 1 to n do read(x[i]);

ans := 0; s := 0;

get_prime;

search(1, 0);

writeln(ans)

end.

一個神牛的題解.......

求noip08普及組複賽《選數》的源程式(pascal語言)

2樓:匿名使用者

選數是noip2002普及的第二題,附我的程式,我們學校的題庫:http://pingce.ayyz.cn:9000

望採納!!!

varx:array[1..20]of longint;

n,k,i,j,total:integer;

y:array[1..500]of boolean;

procedure find(left,now,all:integer);

begin

if left>n-now+1 then exit;

if (left=0)and(now>n)then

begin

if y[all] then inc(total);

exit;

end;

find(left,now+1,all);

if left>0 then

find(left-1,now+1,all+x[now]);

end;

begin

readln(n,k);

for i:=1 to n do

read(x[i]);

fillchar(y,sizeof(y),true);

y[1]:=false;

for i:=2 to 500 do

if y[i] then

for j:=2 to 500 div i do y[i*j]:=false;

find(k,1,0);

writeln(total);

end.

3樓:o逸水之寒

我沒有影響有這道題目啊!

pascal程式設計:數字遊戲

4樓:匿名使用者

不一定是最優,僅提供一種思路 !

vara:array[1..15,1..15] of integer;

p,d,d0:array[1..15] of integer;

b:array[1..15] of boolean;

i,j,n:integer;

sum:integer;

find:boolean;

function s:integer;

vari,j:integer;

begin

for j:=1 to n do a[1,j]:=d[j];

for i:=2 to n do

for j:=1 to n-i+1 do

a[i,j]:=a[i-1,j]+a[i-1,j+1];

s:=a[n,1];

end;

procedure pailie(x:integer);

varm:integer;

begin

if x>n then begin

if s=sum then begin

for m:=1 to n do write(d[m]:3);

writeln;

find:=true;

end;

end else for m:=1 to n doif (not b[m])and(not find) then begin

d0:=d;

d[x]:=p[m];

b[m]:=true;

pailie(x+1);

b[m]:=false;

d:=d0;

end;

end;

begin

n:=12;

sum:=13312;

find:=false;

for i:=1 to n do begin p[i]:=i; b[i]:=false; end;

pailie(1);

end.

pascal程式

5樓:匿名使用者

program zaoshu;

vara:array[1..9] of integer; //存放自然數按位分解的各位數

b:array[1..10000] of longint; //存放位置調整後的每個數

c,sum:longint; //自然數

i,j,k,n:integer; //i,j,n為迴圈變數;k為找到的大數的個數

l,m,code,temp:integer; //l為串長;m位某位數字

t:longint; // t、temp為中間變數

st,st1:string; //st為自然數對應的串;st1為串中單個字元

find:boolean;

begin

readln(c);

str(c,st);

while st[1]=' ' do st:=copy(st,2,length(st)-1);

l:=length(st);

for i:=1 to l do begin //將自然數分解到陣列a中

st1:=copy(st,i,1);

val(st1,m,code);

a[i]:=m;

end;

k:=1; // 找相對大的數,並將找到的數放入陣列b中

//改用氣泡排序,且從末位往高位計算

for i:=l downto 2 do

for j:=l downto 2 do begin

if a[j-1]c then begin writeln(b[i]); find:=true; exit; end;

end;

if not find then writeln('no found !');

end.

6樓:匿名使用者

這一題考查的是數字的全排列,當然這是窮舉的辦法,就是將所有的數字排列可能全部列出來然後排序,找出比原數字大,又是所有可能中最小的數字,在沒有資料範圍要求的情況下這種方法最多隻能算六七位的數字。 需要源**的話可以說一聲,本人正在趕製······ 求採納

free pascal程式設計:給出n個數,你要將這n個數從小到大排序輸出,源程式如下,只需解釋。

7樓:匿名使用者

vara:array[1..10] of longint;

i,j,t,n:longint;

max:longint;

begin

readln(n);

for i:=1 to n do

read(a[i]);

for i:=1 to n-1 do beginmax:=i; {先假設下標為i的元素為最大}for j:

=i+1 to n do if a[j]>a[max] then max:=j;

if max<>i then

begin

t:=a[i]; a[i]:=a[max]; a[max]:=t;

end;

end;

for i:=1 to n do

writeln(a[i]);

end.

pascal程式問題

1.輾轉相除法 用來求公約數 2.整個程式 把每個數除以公約數後得到的都是素數,若是素數就停止。最後的相乘然後又除以5 好像是求相乘後5的倍數的有幾個。不是太懂 輾轉相除法 設兩數為a b b a 求它們最大公約數 a b 的步驟如下 用b除a,得a bq.r 1 0 r 若r1 0,則 a,b b...

求pascal精簡的堆排序演算法程式

孩子,用快排吧 這是最快的 程式1 program kspv const n 7 type arr array 1.n of integer vara arr i integer procedure quicksort var b arr s,t integer var i,j,x,t1 integ...

那位高手告訴下Pascal語言中讀程式裡的各種符號和字母(單

pascal語言中的運算子及其優先順序 單目運算子 最高優先順序 取變數或函式的地址 返回一個指標 not 邏輯取反或按位取反 乘除及按位運算子 相乘或集合交集 浮點相除 div 整數相除 mod 取模 整數相除的餘數 as 程式執行階段型別轉換 rtti運算子 and 邏輯或按位求和 shl 按位...