當前位置:首頁 » 編程軟體 » 翻硬幣編程題

翻硬幣編程題

發布時間: 2022-09-25 09:43:51

Ⅰ 矩陣翻硬幣java編程問題

package;

importjava.util.Arrays;

/**
*標題:矩陣翻硬幣<br>
*
*@authorYugi111
*/
publicclassQ
{
//假設0表示反面
//小明先把硬幣擺成了一個n行m列的矩陣。
int[][]qArray={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};

/**
*隨後,小明對「每一個」硬幣分別進行"一次"Q操作。<br>
*對第x行第y列的硬幣進行Q操作的定義:將所有第i*x行,第j*y列的硬幣進行翻轉。
*/
privatevoidqTurn()
{
//其中i和j為任意使操作可行的正整數>0,行號和列號都是從1開始。
for(intx=1;x<qArray.length;x++)
{
for(inty=1;y<qArray[x].length;y++)
{
for(inti=1;i<qArray.length/x;i++)
{
for(intj=1;j<qArray[x].length/y;j++)
{
//對「每一個」硬幣分別進行"一次"Q操作
qArray[i*x][j*y]=qArray[i*x][j*y]==0?1:0;
}
}
}
}
}

publicstaticvoidmain(String[]args)
{
Qq=newQ();
q.qTurn();
for(inti=0;i<q.qArray.length;i++)
{
System.out.println(Arrays.toString(q.qArray[i]));
}
System.out.println("當小明對所有硬幣都進行了一次Q操作後,他發現了一個奇跡——所有硬幣均為正面朝上。");
System.out.println("小明想知道最開始有多少枚硬幣是反面朝上的。"+"於是,他向他的好朋友小M尋求幫助。 "+"聰明的小M告訴小明,只需要對所有硬幣再進行一次Q操作,"
+"即可恢復到最開始的狀態。然而小明很懶,不願意照做。"+"於是小明希望你給出他更好的方法。幫他計算出答案");
System.out.println(" 由於0表示反面,1表示正面. 所以: ");
intcount=0;
for(inti=0;i<q.qArray.length;i++)
{
for(intj=0;j<q.qArray[i].length;j++)
{
if(q.qArray[i][j]==1)
{
count++;
}
}
}
System.out.println("最開始有"+count+"枚硬幣是反面朝上的");
}
}

Ⅱ pascal程序題翻硬幣

這種題沒什麼技術含量的,純粹考數學,手算就出來了.
n=6的時候:
000000 (0)
111110 (1)
100001 (2)
011100 (3)
110011 (4)
001000 (5)
111111 (6)
一共6步.
n=7的時候:
0000000 (0)
1111100 (1)
1000010 (2)
1111111 (3)
一共3步,顯然沒有更少的了.
n=8的時候:
00000000 (0)
11111000 (1)
10000100 (2)
01110000 (3)
11111111 (4)
一共4步.
當n>=9的時候:
定義f(n)為最少步數.
若n=5k,則順著翻k次即可.f(5k)=k
若n=5k+1,先討論左邊8個:
00000000
11111000
11100111
翻2次,使得8個中有6個被翻過來剩下2個,一共剩5k+1-8+2=5k-5個,再順著翻k-1次即可.所以f(5k+1)=k+1
若n=5k+2,先討論左邊6個:
000000
111110
100001
翻了2次,使得6個中有2個被翻過來,一共剩5k+2-2=5k,順著翻,所以f(5k+2)=k+2
若n=5k+3,先討論左邊9個:
000000000
111110000
111101111
翻了2次,有8個翻過來,一共剩5k+3-8=5k-5,順著翻,所以f(5k+3)=k-1+2=k+1
若n=5k+4,先討論左邊7個:
0000000
1111100
1100011
翻了2次,有4個翻過來,一共剩5k+4-4=5k個,順著翻,所以f(5k+4)=k+2

下面討論下上面的正確性:
5k個至少要翻k次,這是顯然的.5k+1,5k+2,5k+3,5k+4分別至少要翻k+1次,也是顯然的.
所以f(5k)>=k, f(5k+1)>=k+1, f(5k+2)>=k+1, f(5k+3)>=k+1, f(5k+4)>=k+1
由於最終所有的硬幣都要被翻過來,所以每個硬幣都必須被翻奇數次.
不妨設第k個硬幣被翻ak次.
f(n) = a1+a2+...+an ≡ 1+1+...+1(n個1) ≡ n(mod 2) {同餘,也就是同奇偶}
所以f(5k+2)與5k+2同奇偶,但是k+1與5k+2不可能同奇偶,所以f(5k+2)>=k+2.
同理,f(5k+4)與5k+4同奇偶,但5k+4與k+1不可能同奇偶,所以f(5k+2)>=k+2.
綜上,可知討論出的最小值正確.
var n: longint;
begin
readln(n);
if n = 6 then begin writeln(6); exit; end;
if n = 7 then begin writeln(3); exit; end;
if n = 8 then begin writeln(4); exit; end;
if n mod 5 = 0 then begin writeln(n div 5); exit; end;
if n mod 5 = 1 then begin writeln(n div 5 + 1); exit; end;
if n mod 5 = 2 then begin writeln(n div 5 + 2); exit; end;
if n mod 5 = 3 then begin writeln(n div 5 + 1); exit; end;
if n mod 5 = 4 then begin writeln(n div 5 + 2); exit; end;
end.

Ⅲ 給一些程序填空題,PASCAL的

真想要?要有耐心看下去的。。。。
自己挑些題做吧。
2006:
1.(選排列)下面程序的功能是利用遞歸方法生成從 1 到 n(n<10)的 n 個數中取 k(1<=k<=n)個數的 全部可能的排列(不一定按升序輸出)。例如,當 n=3,k=2 時,應該輸出(每行輸出 5 個排列):

12 13 21 23 32

31
程序:
Program ex501; Var i,n,k:integer;
a:array[1..10] of integer;

count:longint;

Procere perm2(j:integer);

var i,p,t:integer;

begin

if ① then

begin

for i:=k to n do begin inc(count);
t:=a[k]; a[k]:=a[i]; a[i]:=t;

for ② do write(a[p]:1);

write(' ');

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

if (count mod 5=0) then writeln;

end; exit; end;
for i:=j to n do begin
t:=a[j];a[j]:=a[i];a[i]:=t;由OIFans.cn收集

③ ;

t:=a[j]; ④ ;

end end; begin
writeln('Entry n,k (k<=n):'); read(n,k);

count:=0;

for i:=1 to n do a[i]:=i;
⑤ ;

end.

2.(TSP 問題的交叉運算元)TSP 問題(Traveling Salesman Problem)描述如下:給定 n 個城 市,構成一個完全圖,任何兩城市之間都有一個代價(例如路程、旅費等),現要構造遍歷所有城市的環 路,每個城市恰好經過一次,求使總代價達到最小的一條環路。

遺傳演算法是求解該問題的一個很有效的近似演算法。在該演算法中,一個個體為一條環路,其編碼方法 之一是 1 到 n 這 n 個數字的一個排列,每個數字為一個城市的編號。例如當 n=5 時,「3 4 2 1 5」 表示該方案實施的路線為 3->4->2->1->5->3。遺傳演算法的核心是通過兩個個體的交叉操作,產生兩 個新的個體。下面的程序給出了最簡單的一種交叉演算法。具體過程如下:
(1)選定中間一段作為互換段,該段的起止下標為 t1,t2,隨機生成 t1,t2 後,互換兩段。
(2)互換後,在每個新的排列中可能有重復數字,因而不能作為新個體的編碼,一般再做兩步處理:
(2.1) 將兩個互換段中,共同的數字標記為 0,表示已處理完。
(2.2) 將兩個互換段中其餘數字標記為 1,按順序將互換段外重復的數字進行替換。 例如:n=12,兩個個體分別是:

a1: 1 3 5 4 * 2 6 7 9 * 10 12 8 11

a2: 3 2 1 12 * 6 7 10 11 * 8 5 4 9
t1=5,t2=8。上述每一行中,兩個星號間的部分為互換段。假定數組的下標從 1 開始,互換後有:

a1: 1 3 5 4 * 6 7 10 11 * 10 12 8 11

a2: 3 2 1 12 * 2 6 7 9 * 8 5 4 9
然後,將數字 6,7 對應的項標記為 0,星號內數字 2,9,10,11 對應的項標記為 1,並且按順序對 應關系為:10<->2,11<->9。於是,將 a1[9]=10 替換為 a1[9]=2,將 a2[2]=2 替換為 a2[2]=10, 類似再做第 2 組替換。這樣處理後,就得到了兩個新個體:

a1: 1 3 5 4 6 7 10 11 2 12 8 9

a2: 3 10 1 12 2 6 7 9 8 5 4 11
(3)輸出兩個新個體的編碼。 程序:

program ex502;

type arr1=array[1..20] of integer;

var a1,a2,kz1,kz2:arr1; n,k,t1,t2:integer;
function rand1(k:integer):integer;

var t:integer;

begin t:=0;
while (t<2) or(t>k) do t:=random(k+1)-2; rand1:=t;
end;

procere read1(var a:arr1;m:integer);
{讀入數組元素 a[1]至 a[m],a[0]=0,略。}

procere wrt1(var a:arr1;m:integer);
{輸出數組元素 a[1]至 a[m],略。}
procere cross(var a1,a2:arr1;t1, t2,n:integer);由OIFans.cn收集

var i,j,t,kj:integer; begin
for i:=t1 to t2 do begin
t:=a1[i]; ① ;

end;

for i:=1 to n do

if (i<t1)or(i>t2) then begin
kz1[i]:=-1;kz2[i]:=-1;

end else
begin ② ; end;

for i:=t1 to t2 do for j:=t1 to t2 do
if(a1[i]=a2[j]) then
begin ③ ; break; end;

for i:=t1 to t2 do if(kz1[i]=1) then begin
for j:=t1 to t2 do if(kz2[j]=1) then
begin kj:=j; break; end;

for j:=1 to n do if ④ then

begin a1[j]:=a2[kj];break; end;

for j:=1 to n do if ⑤ then

begin a2[j]:=a1[i]; break; end;

kz1[i]:=0;kz2[kj]:=0;

end; end; begin
writeln('input (n>5):');

readln(n);

writeln('input array 1:'); read1(a1,n);
writeln('input array 2:'); read1(a2,n);

t1:=rand1(n-1);

repeat

t2:=rand1(n-1); until(t1<>t2); if(t1>t2) then
begin k:=t1; t1:=t2; t2:=k; end;

⑥ ;

wrt1(a1,n); wrt1(a2,n);

end.

2005:
1.木材加工
題目描述:
木材廠有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭(木頭有可能有
剩餘),需要得到的小段的數目是給定的。當然,我們希望得到的小段越長越好,你的任務
是計算能夠得到的小段木頭的最大長度。
木頭長度的單位是cm。原木的長度都是正整數,我們要求切割得到的小段木頭的長度
也是正整數。
輸入:
第一行是兩個正整數N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的數目,
K是需要得到的小段的數目。
接下來的N行,每行有一個1到10000之間的正整數,表示一根原木的長度。
輸出:
輸出能夠切割得到的小段的最大長度。如果連1cm長的小段都切不出來,輸出」0」。
輸入樣例:
3 7
232
124
456
輸出樣例:
114
程序:
var
n, k : integer;
len : array [1..10000] of integer;
i, left, right, mid : integer;
function isok(t : integer) : boolean;
var
num, i : integer;
begin
num := 0;
for i := 1 to n do begin
if num >= k then break;
num := ① ;
end;
if ② then isok := true
else isok := false;
end;
begin
readln(n, k);
right := 0;
for i := 1 to n do begin
readln(len[i]);
if right < len[i] then right := len[i];
end;
inc(right);
③ ;
while ④ < right do begin
mid := (left + right) div 2;
if ⑤ then right := mid
else left := mid;
end;
writeln(left);
end.
2.N叉樹
題目描述:
我們都了解二叉樹的先根遍歷,中根遍歷和後根遍歷。當知道先根遍歷的結果和中根遍
歷結果的時候,我們可以唯一的確定二叉樹;同樣的,如果知道了後根遍歷的結果和中根遍
歷結果,二叉樹也是唯一確定的。但是如果只知道先根遍歷和後根遍歷的結果,二叉樹就不
是唯一的了。但是我們可以計算滿足條件的不同二叉樹一共有多少個。這不是一個很困難的
問題,稍微復雜一點,我們把這個問題推廣到N叉樹。
我們用小寫英文字母來表示N 叉樹的結點,不同的結點用不同的字母表示。比如,對
於4叉樹,如果先根遍歷的結果是abdefgc,後根遍歷的結果是defgbca,那麼我們可以
得到6個不同的4叉樹(如下圖)。
輸入:
輸入數據包括3行。
第一行是一個正整數N(2 ≤ N ≤ 20),表示我們要考慮N叉樹。
第二行和第三行分別是兩個字元串序列,分別表示先根遍歷和後根遍歷的結果。
輸出:
輸出不同的N叉樹的數目。題目中給的數據保證得到的結果小於2
31

輸入樣例:
4
abdefgc
defgbca
輸出樣例:
6
程序:
var
str1, str2 : string;
N, len : integer;
com : array[0..100, 0..100] of longint;
function getcom(x, y : integer) : longint;
begin
if (y = 0) or (x = y) then ①
else if com[x][y] <> 0 then getcom := com[x][y]
else begin
com[x][y] := getcom(x - 1, y)+ ② ;
getcom := com[x][y];
end;
end;
function count(a, b, c : integer) : longint;
var
sum : longint;
k, s, t, p : integer;
begin
sum := 1; k := 0; s := a + 1; t := c;
if a = b then count := 1
else begin
while s <= b do begin
p := t;
while str1[s] <> str2[t] do inc(t);
sum := sum * count(s, s + t - p, p);
s := ③ ;
④ ; inc(k);
end;
count := ⑤ * getcom(N, k);
end;
end;
begin
readln(N); readln(str1); readln(str2);
len := length(str1);
writeln(count( ⑥ ));
end.

2004:
1.Joseph
題目描述:
原始的Joseph問題的描述如下:有n個人圍坐在一個圓桌周圍,把這n個人依次編號為1,…,n。從編號是1的人開始報數,數到第m個人出列,然後從出列的下一個人重新開始報數,數到第m個人又出列,…,如此反復直到所有的人全部出列為止。比如當n=6,m=5的時候,出列的順序依次是5,4,6,2,3,1。
現在的問題是:假設有k個好人和k個壞人。好人的編號的1到k,壞人的編號是k+1到2k。我們希望求出m的最小值,使得最先出列的k個人都是壞人。
輸入:
僅有的一個數字是k(0 < k <14)。
輸出:
使得最先出列的k個人都是壞人的m的最小值。
輸入樣例:
4
輸出樣例:
30
程序:
program program1;
var
i, k, m, start: longint;
find: boolean;
function check(remain: integer): boolean;
var result: integer;
begin
result:=( ① ) mod remain;
if( ② )then begin
start := result; check := true;
end
else check := false;
end;
begin
find := false;
read(k);
m := k;
while ( ③ ) do begin
find := true; start := 0;
for i := 0 to k-1 do
if( not check( ④ )) then begin
find := false; break;
end;
inc(m);
end;
writeln( ⑤ );
end.

2.邏輯游戲
題目描述:
一個同學給了我一個邏輯游戲。他給了我圖1,在這個圖上,每一段邊界都已經進行了編號。我的任務是在圖中畫一條連續的曲線,使得這條曲線穿過每一個邊界一次且僅穿過一次,而且曲線的起點和終點都在這整個區域的外面。這條曲線是容許自交的。
對於圖1,我的同學告訴我畫出這樣的一條曲線(圖2)是不可能的,但是對於有的圖形(比如圖3),畫出這樣一條曲線是可行的。對於給定的一個圖,我想知道是否可以畫出滿足要求的曲線。

圖1 圖2

圖3 圖4
輸入:
輸入的圖形用一個n×n的矩陣表示的。矩陣的每一個單元里有一個0到255之間(包括0和255)的整數。處於同一個區域的單元里的數相同,相鄰區域的數不同(但是不相鄰的區域里的數可能相同)。
輸入的第一行是n(0<n<100)。以下的n行每行包括n個整數,分別給出對應的單元里的整數(這n個整數之間用空格分開)。圖4給出了輸入樣例對應的圖形。
輸出:
當可以畫出滿足題意的曲線的時候,輸出「YES」;否則,輸出「NO」。
輸入樣例:
3
1 1 2
1 2 2
1 1 2
輸出樣例:
YES
程序:
program program2;
const
d: array[0..7] of integer = (1, 0, -1, 0, 0, 1, ① );
var
orig, n, i, j, ns: integer;
a: array[0..101, 0..101] of integer;
bun: boolean;
procere plimba(x, y: integer);
var i, x1, y1: integer;
begin
a[x, y] := -a[x, y];
if (abs(a[x - 1, y]) <> orig) and (( ② <> a[x - 1, y])
or (abs(a[x, y - 1]) <> orig)) then inc(ns);
if (abs(a[x + 1, y]) <> orig) and ((a[x + 1, y - 1] <> a[x + 1,y])
or (abs(a[x, y - 1]) <> orig)) then inc(ns);
if (abs(a[x, y - 1]) <> orig) and (( ③ <> a[x, y - 1])
or (abs(a[x - 1, y]) <> orig)) then inc(ns);
if (abs(a[x, y + 1]) <> orig) and ((a[x - 1, y + 1] <> a[x,y + 1])
or (abs(a[x - 1, y]) <> orig)) then inc(ns);
for i := 0 to 3 do begin
x1 := x + d[2 * i];y1:=y+ ④ ;
if (x1 >= 1) and (x1 <= n) and (y1 >= 1) and (y1 <= n) and
( ⑤ ) then plimba(x1, y1);
end;
end;
begin
bun := true;
read(n);
for i := 0 to n+1 do
for j := 0 to n+1 do a[i, j] := 0;
a[0, 0] := -1; a[n + 1, 0] := -1;
a[0, n + 1] := -1; a[n + 1, n + 1] := -1;
for i := 1 to n do
for j := 1 to n do read(a[i, j]);
for i := 1 to n do
for j := 1 to n do
if a[i, j] > -1 then begin
ns := 0; ⑥ ;
plimba(i, j);
if ns mod 2 = 1 then bun := false;
end;
if bun then writeln('YES');
if not bun then writeln('NO');
end.

2003:

1. 翻硬幣
題目描述:
一摞硬幣共有m枚,每一枚都是正面朝上。取下最上面的一枚硬幣,將它翻面後放回原處。然後取下最上面的2枚硬幣,將他們一起翻面後放回原處。在取3枚,取4枚……直至m枚。然後在從這摞硬幣最上面的一枚開始,重復剛才的做法。這樣一直做下去,直到這摞硬幣中每一枚又是正面朝上為止。例如,m為1時,翻兩次即可。
輸 入:僅有的一個數字是這摞硬幣的枚數m ,0< m <1000。
輸 出:為了使這摞硬幣中的每一枚都是朝正面朝上所必須翻的次數。
輸入樣例:30
輸出樣例:899
程 序:
program Program1;
var m:integer;
function solve(m: integer):integer;
var i,t,d: integer;
flag: Boolean;
begin
if (m = 1) then
solve := (1)
else begin
d := 2*m+1; t := 2; i := 1; flag := False;
repeat
if (t = 1) then
begin
solve := (2) ; flag := True;
end
else if ( (3) ) then
begin
solve := i*m-1; flag := True;
end
else
t := (4) ;
i:=i+1;
until flag;
end
end;
begin
read(m); if (( (5) ) and (m<1000)) then
writeln( (6) );
end.
2. OIM地形
題目描述:
二維離散世界有一種地形叫OIM(OI Mountain)。這種山的坡度只能上升('/')或下降('\'),而且兩邊的山腳都與地平線等高,山上所有地方都不低於地平線.例如:
/\ /\
/ \/\ 是一座OIM;而 / \ 不是。
\/
這個世界的地理學家們為了方便紀錄,給OIM所有可能的形狀用正整數編好號,而且每個正整數恰好對應一種山形。他們規定,若兩座山的寬度不同,則較寬的編號較大;若寬度相同,則比較從左邊開始第1個坡度不同的地方,坡度上升的編號較大。以下三座OIM的編號有小到大遞增:
/\ /\ /\ /\
/ \/\ / \/\/\ / \/ \。顯然/\的編號為1。但是地理學家在整理紀錄是發覺,查找編號與山形的對應關系不是很方便。他們希望能快速地從編號得到山的形狀。你自告奮勇答應他們寫一個程序,輸入編號,能馬上輸出山形。
輸 入:一個編號(編號大小不超過600,000,000),
輸 出:輸入編號所對應的山形,1座山所佔行數恰為它的高度,即山頂上不能有多餘空行。
輸入樣例:15
輸出樣例: /\ /\
/ \/ \
程 序:
program Program2;
const
L:integer =19; SZ: integer =50;
UP: char = '/'; DN: char = '\';
Var
i,nth,x,y,h,e,f:integer;
m: array[0..1,0..38,0..19] of integer;
pic: array[0..49,0..49] of char;

procere init;
var k,s,a,b,c: integer;
begin
for a:=0 to 1 do
for b:=0 to 2*L do
for c:=0 to L do
m[a,b,c]:=0; m[0,0,0]:=1;
for k:=0 to 2*L-1 do
begin
for s:=1 to L do
begin
m[0,k+1,s] := m[0,k,s+1] + m[1,k,s+1];
m[1,k+1,s]:= (1) ;
end;
m[0,k+1,0] :=m[0,k,1]+m[1,k,1];
end;
end;

procere draw(k,s,nth:integer);
begin
if (k=0) then exit;
if ((nth-m[1,k,s])>=0) then
begin
nth:=nth-m[1,k,s];
if (y>h) then (2) ;
pic[y,x]:=UP; y:=y+1; x:=x+1; draw( (3) );
end
else begin
y:=y - 1; pic[y,x]:=DN; x:=x+1; draw(k-1,s-1,nth);
end;
end;

begin
init;
read(nth);
for e:=0 to SZ-1 do
for f:=0 to SZ-1 do
pic[e,f]:= ' ';
x:=0;
y:=0
h:=0;
i:=0;

while ((nth-m[0,2*i,0])>=0) do
begin
nth:= nth-m[0,2*i,0];
(4) ;
end;
draw( (5) );
for i:=h downto x-1 do
begin
for e:=0 to x-1 do
write(pic[i,e]);
writeln(' ');
end;
end.

2002:
1. 問題描述:工廠在每天的生產中,需要一定數量的零件,同時也可以知道每天生產一個零件的生產單價。在N天的生產中,當天生產的零件可以滿足當天的需要,若當天用不完,可以放到下一天去使用,但要收取每個零件的保管費,不同的天收取的費用也不相同。
問題求解:求得一個N天的生產計劃(即N天中每天應生產零件個數),使總的費用最少。
輸入:N(天數 N<=29)
每天的需求量(N個整數)
每天生產零件的單價(N個整數)
每天保管零件的單價(N個整數)
輸出:每天的生產零件個數(N個整數)
例如:當N=3時,其需要量與費用如下:
第一天 第二天 第三天
需 要 量 25 15 30
生產單價 20 30 32
保管單價 5 10 0
生產計劃的安排可以有許多方案,如下面的三種:
第一天 第二天 第三天 總的費用
25 15 30 25*20+15*30+30*32=1910
40 0 30 40*20+15*5+30*32=1835
70 0 0 70*20+45*5+30*10=1925
程序說明:
b[n]:存放每天的需求量
c[n]:每天生產零件的單價
d[n]:每天保管零件的單價
e[n]:生產計劃
程序:
program exp5;
var
i,j,n,yu,j0,j1,s : integer ;
b,c,d,e : array[0..30] of integer ;
begin
readln(n);
for i:=1 to n do readln(b[i],c[i],d[i]);
for i:=1 to n do e[i]:=0;
①__________:=10000; c[n+2]=0; b[n+1]:=0 j0:=1;
while (j0<=n) do
begin
yu:=c[j0]; j1:=j0; s:=b[j0];
while ②__________ do
begin
③__________ j1:=j1+1; s:=s+b[j1];
end;
④__________ j0:=j1+1;
end;
for i:=1 to n do ⑤__________
readln;
end.
二.問題描述:有n種基本物質(n≤10),分別記為P1,P2,……,Pn,用n種基本物質構造物質,這些物品使用在k個不同地區(k≤20),每個地區對物品提出自己的要求,這些要求用一個n位的數表示:a1a2……a n,其中:
ai = 1表示所需物質中必須有第i種基本物質
= -1表示所需物質中必須不能有第i種基本物質
= 0無所謂
問題求解:當k個不同要求給出之後,給出一種方案,指出哪些物質被使用,哪些物質不被使用。
程序說明:數組 b[1],b[2]……b[n] 表示某種物質
a[1..k,1..n] 記錄k個地區對物品的要求,其中:
a[i,j]=1 表示第i個地區對第j種物品是需要的
a[i,j]=0 表示第i個地區對第j種物品是無所謂的
a[i,j]= -1 表示第i個地區對第j種物品是不需要的
程序:
program gxp2;
var
i,j,k,n : integer ;
p : boolean ;
b : array[0..20] of 0..1 ;
a : array[1..20,1..10] of integer ;
begin
readln(n,k);
for i:=1 to k do
begin
for j:=1 to n do read(a[i,j]);
readln;
end;
for i:=0 to n do b[i]:=0;
p:=true;
while ①__________ do
begin
j:=n;
while b[j]=1 do j:=j-1;
②__________
for i:=j+1 to n do b[i]:=0;
③__________
for i:=1 to k do
for j:=1 to n do
if (a[i,j]=1) and (b[j]=0) or ④__________
then p:=true;
end;
if ⑤__________
then writeln(『找不到!』)
else for i:=1 to n do
if (b[i]=1) then writeln(『物質』,i,』需要』)
else writeln(『物質』,i,』不需要』);
end.

2001:
1.存儲空間的回收演算法。設在內存中已經存放了若干個作業A,B,C,D。其餘的空間為可用的(如圖一中(a))。

此時,可用空間可用一個二維數組dk[1..100,1..2 ]表示,(如下表一中(a)),其中:dk[i,1]對應第i個可用空間首址,dk[i,2]對應第i個可用空間長度如上圖中,dk:

100 50
300 100
50 100
0 0
100 50
300 100
500 100
10000 0

表一(a) 表一(b)
現某個作業釋放一個區域,其首址為d,長度為L,此時將釋放區域加入到可用空間表中。要求在加入時,若可用空間相鄰時,則必須進行合並。因此出現下面的4種情況(如上圖一(b)所示)。
(1)下靠,即回收區域和下面可用空間相鄰,例如,d=80,L=20,此時成為表二中的(a)。
(2)上靠,例如,d=600,L=50,此時表成為表二中的(b)。
(3)上、下靠,例如,d=150,L=150,此時表成為表二中的(c)。
(4)上、下不靠,例如,d=430,L=20,此時表成為表二中的(d)。

80 70
300 100
50 100
100 50
300 100
500 150

100
300

500
100
100 50
300 100
430 20
500 100

表二(a)(下靠) 表二(b)(上靠) 表二(c)(上,下靠) 表二(d)(上,下不靠)
程序說明:對數組dk預置2個標志,即頭和尾標志,成為表二中(b),這樣可使演算法簡單,sp為dk表末地址。
程序清單:
PROGRAM GAO7_5;
VAR I,J,SP,D,L:INTEGER;
DK :ARRAY[0..100,1..2]OF INTEGER;
BEGIN
READLN(SP);
FOR I:=1 TO SP DO
READLN(DK[I,1],DK[I,2]);
DK[0,1]:=0;DK[0,2]:=0; ① ;
DK[SP,1]:=10000;DK[SP,2]:=0;READLN(D,L);I:=1;
WHILE DK[I,1]<D DO I:=I+1; ② ;
IF(DK[I,1]+DK[I,2]=D)THEN
IF(D+L=DK[I+1,1])THEN
BEGIN
DK[I,2]:= ③ ;
FOR J:=I+1 TO SP-1 DO
DK[J]:=DK[J+1];
SP:=SP-1;
END
ELSE DK[I,2]:=DK[I,2]+L
ELSE IF(D+L=DK[I+1,1])THEN
BEGIN
DK[I+1,1]::= ④ ;DK[I+1,2]:=DK[I+1,2]+L
END
ELSE BEGIN
FOR J:=SP DOWNTO I+1 DO DK[J+1]:=DK[J];
⑤ :=D; DK[I+1,2]:=L;SP:=SP+1;
END;
FOR I:=1 TO SP-1 DO WRITELN(DK[I,1]:4,DK[I,2]:4);READLN;
END.

2.求關鍵路徑
設有一個工程網路如下圖表示(無環路的有向圖):
其中,頂點表示活動,①表示工程開始,⑤表示工程結束(可變,用N表示),邊上的數字表示活動延續的時間。

如上圖中,活動①開始5天後活動②才能開始工作,而活動③則要等①、②完成之後才能開始,即最早也要7天後才能工作。
在工程網路中,延續時間最長的路徑稱為關鍵路徑。上圖中的關鍵路徑為:①—②—③—④—⑤共18天完成。
關鍵路徑的演算法如下:
1.數據結構:
R[1..N,1..N]OF INTEGER; 表示活動的延續時間,若無連線,則用-1表示;
EET[1..N] 表示活動最早可以開始的時間
ET[1..N] 表示活動最遲應該開始的時間
關鍵路徑通過點J,具有如下的性質:EET[J]=ET[J]
2.約定:
結點的排列已經過拓撲排序,即序號前面的結點會影響序號後面結點的活

c語言,編寫模擬翻硬幣得程序。

#include<stdio.h>

int main(void)

{

int n;//讀入一個數,為結束的次數

int i;

int a[10];//10個硬幣

int biaoji = 0;//當這個標記能被3或7整除,說明恰好數了3次或7次

scanf("%d", &n);

for (i = 0; i < 10; i++) //將硬幣都初始化為正面的狀態,即1

a[i] = 1;

biaoji = 1;//因為a[]的下標不允許超過9,故要重置

a[biaoji - 1] = !a[biaoji - 1];//改變硬幣的狀態

for (i = 0; i < 10; i++)

printf("%d", a[i]);

return 0;

}

主要特點

C語言是一種結構化語言,它有著清晰的層次,可按照模塊的方式對程序進行編寫,十分有利於程序的調試,且c語言的處理和表現能力都非常的強大,依靠非常全面的運算符和多樣的數據類型,可以輕易完成各種數據結構的構建,通過指針類型更可對內存直接定址以及對硬體進行直接操作,因此既能夠用於開發系統程序,也可用於開發應用軟體。

Ⅳ 解釋下fillchar(a,sizeof(a),false)

fillchar
Pascal(一種同C語言的編程語言)的一個函數。
C語言 網路內容來自於: C語言Combined Language(組合語言)的中英混合簡稱是一種計算機程序設計語言。它既有高級語言的特點,又具有匯編語言的特點。它可以作為系統設計語言,編寫工作系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。C語言對操作系統和系統使用程序以及需要對硬體進行操作的場合,用C語言明顯優於其它解釋型高級語言,有一些大型應用軟體也是用C語言編寫的。

c語言C語言是一種計算機程序設計語言。它既有高級語言的特點,又具有匯編語言的特點。它可以作為系統設計語言,編寫工作系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。因此,它的應用范圍廣泛。

Ⅵ pascal翻硬幣

① 2
② i*m
③ t=2*m
④ (t*2)mod d
⑤ solve(m)

Ⅶ Java編程 翻硬幣問題

public class A {
public static void main(String[] args) {
int j=0;
int n=0;
while(true)
{
for(int i=0;i<6;i++)
{
int r = (int) (Math.random()*1000%2);
if(r==0)j+=1;
String s = r==0?"正面 ":"反面 ";
System.out.print(s);
}
if(j==3){System.out.println("第"+n+"次出現了三個正面和三個反面");break;}
else{
j=0;
n+=1;
System.out.println();
}
}
}
}

Ⅷ C++編程 翻硬幣

這題顯然在線不可做,我們考慮離線,將所有操作保存下來,並且差分,把一次[l,r]取反變成兩次[0,l-1]和[0,r]取反,記錄在數組里,因為取兩次反和不取反是一樣的,且取反先後順序沒有影響,這樣我們從0開始往後掃,掃到一個端點時,如果它之後(包括它自己)有偶數次操作,continue,否則將它和上一端點之間的位置取反。每個位置只會被取反一次所以是O(n)的

Ⅸ 求題!!!!!大家來幫忙!!!!

第九屆全國青少年信息學奧林匹克聯賽(NOIP2003)初賽試題

一、單項選擇題
第九界全國青少年信息學奧林匹克聯賽初賽試題
(提高組 PASCAL 語言 二小時完成)
●● 全部答案均要寫在答案卷子上,寫在試卷紙上一律無效 ●●
一、單項選擇題 (共10題,每題1.5分,共計15分。每題有且僅有一個正確答案.)。
1. 圖靈 (Alan Turing) 是 ( )。
A) 美國人 B) 英國人 C) 德國人 D) 匈牙利人 E) 法國人
2. 第一個給計算機寫程序的人是( )。
A) Alan Mathison Turing B) Ada Lovelace C) John von Neumann
D) John Mc-Carthy E) Edsger Wybe Dijkstra
3. 十進制數2003等值於二進制數( )。
A) 0100000111 B) 10000011 C) 110000111 D) 11111010011 E) 1111010011
4. 假設A=true,B=false,C=ture,D=ture,邏輯運算表達式A∧B∨C∧D的值是( )。
A) ture B) false C) 0 D) 1 E) NULL
5. 一個高度為h 的二叉樹最小元素數目是( )。
A) 2h+1 B) h C) 2h-1 D) 2h E) 2h-1
6. 已知隊列(13,2,11,34,41,77,5,7,18,26,15),第一個進入隊列的元素是13,則第五個出隊列的元素是( )。
A) 5 B) 41 C) 77 D) 13 E) 18
7. 下面一段程序是用( )語言書寫的。
int func1(int n){
int i,sum=0;
for(i=1;i<=n;i++)
sum+=i*i;
return sum;
}
A) FORTRAN B) PASCAL C) C D) PROLOG E) BASIC
8. 設全集E={1,2,3,4,5},集合A={1,4},B={1,2,5},C={2,4},則集合(A ∩B)∪~C 為( )。
A) 空集 B) {1} C) {3,5} D){1,5} E) {1,3,5}
9. 表達式(1+34)*5-56/7 的後綴表達式為( )。
A) 1+34*5-56/7 B) -*+1 34 5/56 7 C) 1 34 +5*56 7/-
D) 1 34 5* +56 7/- E) 1 34+5 56 7-*/
10. 下列計算機設備,即是輸入設備,又是輸出設備的是( )。
A) 鍵盤 B) 觸摸屏 C) 掃描儀 D)投影儀 E) 數字化儀
二、不定項選擇題
二、不定項選擇題(共10題,每題1.5分,共計15分。多選少選均不得分)。
11. 下列解析度的顯示器顯示出的圖像,最清晰的是( )。
A) 800*600 B) 1024*768 C) 640*480 D) 1280*1024 E) 800*1000
12. 下列說法中,哪個(些)是錯誤的( )。
A)程序是指令的序列,它有三種結構:順序、分支和循環。
B)數據匯流排決定了中央處理器CPU所能訪問的最大內存空間的大小。
C)中央處理器CPU內部有寄存器組,用來儲存數據。
D)不同廠家生產的CPU所能處理的指令集是相同的。
E)數據傳輸過程中可能會出錯,奇偶校驗法可以檢測出數據中那一為在傳輸中出了差錯。
13. CPU訪問內存的速度比訪問下列哪個(些)存儲設備要慢( )。
A)寄存器 B)硬碟 C)軟盤 D)高速緩存 E)光碟
14. 下列電子郵件地址,哪個(些)是正確的( )。
A)[email protected] B) [email protected] C) 162.105.111.22
D) ccf.e.cn E)http://www.sina.com
15. 數字圖像文件可以用下列哪個(些)軟體來編輯( )。
A)畫筆(Paintbrush) B)記事薄(Notepad) C) Photoshop D) WinRAR E)Midisoft
16. 下列哪個(些)軟體不是操作系統軟體的名字( )。
A)WindowsXP B) DOS C) Linux D) OS/2 E) Arch/Info
17. 下列哪個(些)不是個人計算機的硬體組成部分( )。
A)主板 B)虛擬內存 C)電源 D)硬碟 E)匯流排
18. 運算試(2008)10-(3723)8 的結果是( )。
A)(-1715)10 B) (5)10 C) (5)16 D) (101)2 E) (3263)8
19. 已知元素(8,25,14,87,51,90,6,19,20),問這些元素以怎樣的順序進入棧,才能使出棧的順序滿足:8在51前面;90在87的後面;20在14的後面;25在6的前面;19在90的後面。( )。
A)20,6,8,51,90,25,14,19,87
B)51,6,19,20,14,8,87,90,25
C)19,20,90,7,6,25,51,14,87
D)6,25,51,8,20,19,90,87,14
E)25,6,8,51,87,90,19,14,20
20. 假設我們用d=(a1,a2,…,a5),表示無向圖G的5個頂點的度數,下面給出的哪(些)組d 值合理( )。
A){5,4,4,3,1} B){4,2,2,1,1} C){3,3,3,2,2}
D){5,4,3,2,1} E){2,2,2,2,2}
三、問題求解
三、問題求解(共2題,每題5分,共計10分)
1. 無向圖G有16條邊,有3個4度頂點、4個3度頂點,其餘頂點的度均小於3,則G至少_______個頂點。
2. 某年級學生共選修6門課程,期末考試前,必須提前將這6門課程考完,每人每天只在下午至多考一門課程,設6門課程為C1,C2,C3,C4,C5,C6,S(Ci)為學習Ci 的學生集合。已知S(Ci)∩S(C6)≠ф,i=1,2,…,5,S(Ci)∩S(Ci+1)≠ф,i=1,2,3,4,S(C5)∩S(C1)≠ф,問至少安排_____天才能考完這6門課程。
四. 閱讀程序
四.閱讀程序(共4題,每題8分,共計32分)
1. program Program1;
var a,b,c,d,sum : longint;

begin
read(a,b,c,d);
a := a mod 23; b := b mod 28; c := c mod 33;
sum := a * 5544 + b * 14421 + c * 1228 – d;
sum := sum + 21252; sum := sum mod 21252;
if (sum = 0 ) then sum := 21252;
writeln(sum);
end.
輸入:283 102 23 320 輸出____________
2. program Program2;
const
u : array[1..4] of integer = (0,5,3,1);
v : array[1..4] of integer = (0,7,6,5);
var a,b,c,d,e,f,x,y,z: integer;
begin
read(a,b,c,d,e,f);
z := f+ e + d + (c+3) div 4; y := 5 * d + u[c mod 4];
if (b > y) then
begin
z := z + (b – y + 8) div 9;
x := ((b – y + 8) div 9 * 9 –(b – y)) * 4 + 11 * e + v[c mod 4];
end
else
x := (y – b) * 4 + 11 * e + v[c mod 4];
if (a > x) then
z := z + (a – x + 35) div 36;
writeln(z)
end.
輸入: 4 7 9 20 56 47 輸出____________________
3. program Program3;
var m,n: integer; mark: Boolean;
function test(m,N:integer):integer;
var i,p: integer; flag: boolean;
begin
m := m – 1; i := 0; flag := False;
for p:= 2*N downto (N+1) do
begin
i:= (i+m) mod p;
if (i<N) then
begin
test := 0; flag := Ture; Break;
end
end;
if not(flag) then test:=1;
end;
begin
read(n); m:=1; Mark := False;
repeat
if (test(m,n)=1) then
begin writeln(m); break; end;
m:= m+1;
until Mrak;
end.
輸入:7 輸出_________
4. program Program4;
var m,n,i,j: integer;
p,w,a,b: array[0..19] of integer;
begin
read(n); m:= 0;
for i:= 0 to n-1 do
begin read(p[i]); b[i]:=1; end;
for i:=0 to n-1 do
begin
if (i>0) then
a[m]:=p[i]-p[i-1]
else
a[m]:=p[i];
m:=m+1;
while ((m>1) and (a[m-1]=0)) do
begin m:=m-1; b[m]:=1; end;
if (m>0) then
w[i]:=b[m-1];
else
w[i]:=b[0];
a[m-1]:=a[m-1]-1;
for j:=0 to m-1 do b[j]:=b[j]+1;
while ((m>1) and (a[m-1]=0)) do
begin
m:=m-1; b[m]:=1;
end;
end;
for i:= 0 to n-1 do
begin
write(w[i]); write(' ');
end;
writeln(' ');
end.
輸入:9
4 6 6 6 6 8 9 9 9 9
輸出:____________________
五. 完善程序—1、翻硬幣
五. 完善程序(共2題,第1題每空3分;第2題每空2分。共計28分)。
1. 翻硬幣
題目描述:
一摞硬幣共有m枚,每一枚都是正面朝上。取下最上面的一枚硬幣,將它翻面後放回原處。然後取下最上面的2枚硬幣,將他們一起翻面後放回原處。在取3枚,取4枚……直至m枚。然後在從這摞硬幣最上面的一枚開始,重復剛才的做法。這樣一直做下去,直到這摞硬幣中每一枚又是正面朝上為止。例如,m為1時,翻兩次即可。
輸 入:僅有的一個數字是這摞硬幣的枚數m ,0< m <1000。
輸 出:為了使這摞硬幣中的每一枚都是朝正面朝上所必須翻的次數。
輸入樣例:30
輸出樣例:899
程 序:
program Program1;
var m:integer;
function solve(m: integer):integer;
var i,t,d: integer;
flag: Boolean;
begin
if (m = 1) then
solve := (1)
else begin
d := 2*m+1; t := 2; i := 1; flag := False;
repeat
if (t = 1) then
begin
solve := (2) ; flag := True;
end
else if ( (3) ) then
begin
solve := i*m-1; flag := True;
end
else
t := (4) ;
i:=i+1;
until flag;
end
end;
begin
read(m); if (( (5) ) and (m<1000)) then
writeln( (6) );
end.
五. 完善程序—2、OIM地形
2. OIM地形
題目描述:
二維離散世界有一種地形叫OIM(OI Mountain)。這種山的坡度只能上升('/')或下降('\'),而且兩邊的山腳都與地平線等高,山上所有地方都不低於地平線.例如:
/\ /\
/ \/\ 是一座OIM;而 / \ 不是。
\/
這個世界的地理學家們為了方便紀錄,給OIM所有可能的形狀用正整數編好號,而且每個正整數恰好對應一種山形。他們規定,若兩座山的寬度不同,則較寬的編號較大;若寬度相同,則比較從左邊開始第1個坡度不同的地方,坡度上升的編號較大。以下三座OIM的編號有小到大遞增:
/\ /\ /\ /\
/ \/\ / \/\/\ / \/ \。顯然/\的編號為1。但是地理學家在整理紀錄是發覺,查找編號與山形的對應關系不是很方便。他們希望能快速地從編號得到山的形狀。你自告奮勇答應他們寫一個程序,輸入編號,能馬上輸出山形。
輸 入:一個編號(編號大小不超過600,000,000),
輸 出:輸入編號所對應的山形,1座山所佔行數恰為它的高度,即山頂上不能有多餘空行。
輸入樣例:15
輸出樣例: /\ /\
/ \/ \
程 序:
program Program2;
const
L:integer =19; SZ: integer =50;
UP: char = '/'; DN: char = '\';
Var
i,nth,x,y,h,e,f:integer;
m: array[0..1,0..38,0..19] of integer;
pic: array[0..49,0..49] of char;

procere init;
var k,s,a,b,c: integer;
begin
for a:=0 to 1 do
for b:=0 to 2*L do
for c:=0 to L do
m[a,b,c]:=0; m[0,0,0]:=1;
for k:=0 to 2*L-1 do
begin
for s:=1 to L do
begin
m[0,k+1,s] := m[0,k,s+1] + m[1,k,s+1];
m[1,k+1,s]:= (1) ;
end;
m[0,k+1,0] :=m[0,k,1]+m[1,k,1];
end;
end;

procere draw(k,s,nth:integer);
begin
if (k=0) then exit;
if ((nth-m[1,k,s])>=0) then
begin
nth:=nth-m[1,k,s];
if (y>h) then (2) ;
pic[y,x]:=UP; y:=y+1; x:=x+1; draw( (3) );
end
else begin
y:=y – 1; pic[y,x]:=DN; x:=x+1; draw(k-1,s-1,nth);
end;
end;

begin
init;
read(nth);
for e:=0 to SZ-1 do
for f:=0 to SZ-1 do
pic[e,f]:= ' ';
x:=0;
y:=0
h:=0;
i:=0;

while ((nth-m[0,2*i,0])>=0) do
begin
nth:= nth-m[0,2*i,0];
(4) ;
end;
draw( (5) );
for i:=h downto x-1 do
begin
for e:=0 to x-1 do
write(pic[i,e]);
writeln(' ');
end;
end.

參考答案
一、單選10題 每題1.5分
B B D A B
B C E C B
二、不定項選擇10題 每題1.5分
D BDE AD AB AC
E B BCD D BE
三、問題求解 每題5分
1.答:11
2.答:4
四、閱讀程序 每題8分
1. 8910
2. 126
3. 1872
4. 1 1 2 4 5 1 1 3 9 (空格分隔)
五、完善程序
題一
(1)2
(2)i*m
(3)t=2*m
(4)(t*2) mod d
(5)m>0
(6)solve(m)
題二 OIM
(1)m[0,k,s-1]+m[1,k,s-1]
(2)h:=y
(3)k-1,s+1,nth
(4)i:=i+1
(5)2*i,0,nth
來自官方的參考解答,部分題目有可能存在其他正確解答。
各位選手可以自己估分,以上答案為紅色部分難度較大,正確率極低,一般選手正常發揮得分在55~65之間,最高得分估計不超過85分。

Ⅹ C++編程題目 定義一個類coin 模擬翻硬幣游戲

#include <stdio.h>
class COIN
{
public:
COIN(int n1,int k1){
n = n1;
k = k1;
a = new int[n];
for(int i = 0; i < n ; i++){
a[i] = 1;
}
}
~COIN(){
delete []a;
}
void fun(){
int i = 0;
for(int j = 1 ; j <= k ;j++){
i = (j - 1) % n; //寫為 i = j%n 亦可
if( ! ( j % 3) ){
a[i] = 1 - a[i] ;
continue;
}
if( ! (j % 5)){
a[i] = 1 - a[i];
continue;
}
}
}
void print(){
int i;
for(i = 0 ; i < n - 1 ; i ++){
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}

private:
int * a;
int n;
int k;

};

int main ()
{
COIN *a = new COIN(12,100);
a->fun();
a->print();
delete a;
}

熱點內容
sql字元串取數字 發布:2025-05-15 22:57:45 瀏覽:123
推薦編程課 發布:2025-05-15 22:34:12 瀏覽:617
表拒絕訪問 發布:2025-05-15 22:29:37 瀏覽:978
電腦怎樣解壓文件 發布:2025-05-15 22:25:32 瀏覽:439
dns伺服器怎麼看 發布:2025-05-15 22:17:27 瀏覽:151
3dm的壓縮包 發布:2025-05-15 22:09:23 瀏覽:662
和存儲字長 發布:2025-05-15 21:54:09 瀏覽:515
用什麼寫c語言 發布:2025-05-15 21:35:56 瀏覽:418
linux讀取u盤 發布:2025-05-15 21:32:13 瀏覽:508
c語言dos 發布:2025-05-15 21:18:17 瀏覽:664