中文字幕精品无码一区二区,成全视频在线播放观看方法,大伊人青草狠狠久久,亚洲一区影音先锋色资源

(信息學奧賽輔導)程序設計試題匯編(答案)

資源下載
  1. 二一教育資源

(信息學奧賽輔導)程序設計試題匯編(答案)

資源簡介

程序設計試題及答案
(備注:試題難度評價采取五★級評價體系,分基礎、容易、一般、稍難、難五個等級,其中的一、二、三★級都屬于程序設計的基礎試題級別,同學們稍加思考均有能力求得正確解答,對于四★級試題屬于程序設計試題基礎級別的思考題,五★級難度試題在此沒有涉及,在程序設計高級試題中另行講解。對于基礎和容易兩個級別的程序設計試題,若能夠給出語句分類(如If條件語句、條件語句嵌套、循環語句、多重循環語句等)的將盡量給出。若屬于13大類別的將盡量標注。)
程序設計試題幾大分類:
素數類問題(求素數的幾種算法):
數據排序問題(數據排序的幾種方法):
最大公約數和最小公倍數問題(幾種算法):
公式求解類問題(如求圓周率π、自然常數e、解方程等等):
編號相反處理問題:
約瑟夫問題(或猴子選大王問題、密碼問題):
回文數問題:
高精度數值計算問題:
數值計算問題:
進制相互轉換問題:
字符串倒置問題:
排列與組合類問題:
因子、質因子(質因數)類相關問題:
答案部分:
(程序設計的源程序沒有統一的標準答案,實現程序的算法也是多種多樣,但結果是唯一的,算法也有優劣之分,一個程序的優劣,關鍵在于是否找到了好的算法,以下程序和算法不一定就是最佳算法和最佳程序,只能僅供參考,希望同學們能夠對某些程序提出更好的算法來改進程序)
(經常碰到的判斷是否為素數、是否為回文數、求兩個數的最大公約數、求兩個數的最小公倍數等問題的子函數源程序,請務必記住!)
①判斷是否為素數,若是素數則返回true,若不是素數則返回false:
fun_ction prime(x:longint):boolean;
var
j,y:longint;
begin
prime:=true;
if x<2 then prime:=false;
y:=trunc(sqrt(x));
for j:=2 to y do
if (x mod j = 0) then
begin prime:=false; exit; end;
end;
備注:1~100之間所有的素數:2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97。(共25個)
②判斷是否為回文數,若是回文數則返回true,若不是回文數則返回false:
fun_ction huiwen(n:longint):boolean;
var
m,i,j:longint;
a:array[1..10] of integer;
begin
if n<0 then begin huiwen:=false; exit; end;
m:=n; i:=0; huiwen:=true;
repeat
i:=i+1;
a[i]:=m mod 10;
m:=m div 10;
until m=0;
for j:=1 to (i div 2) do
if a[j]<>a[i-j+1] then
begin huiwen:=false; exit; end;
end;
③求最大公約數子函數,返回兩個正整數的最大公約數,采用輾轉相除法算法;
fun_ction gcd(a,b:longint):longint;
begin
if b=0 then gcd:=a
else gcd:=gcd(b,a mod b);
end;
④求最小公倍數:lcm=a*b div gcd(a,b);
(以下程序設計試題來自《奧賽經典(語言篇)》)
基本語句與程序結構
例題部分:
求梯形的面積。(梯形面積公式:)
(★,測試數據①
求一元二次方程ax2+bx+C=0的兩個實根。(求根公式:)
(★,測試數據a=1,b=-5,c=6;答案:x1=2、x2=3)
輸入一個三位的自然數,然后把這個數的百位與個位對調,輸出對調后的結果。 (★)
輸入三個數a、b、c,首先判斷這三個數能否構成三角形,若能,則求出三角形的面積。
(提示:海倫公式,其中,a、b、c為邊長)
(★,If條件語句,測試數據a=5,b=6,c=7;答案:14.7)
從鍵盤讀入三個數,按從大到小的順序把它們打印出來。(★,If條件語句)
輸入三角形的三邊,判斷它是否是直角三角形。
(★,If條件語句,測試數據①3、4、5;②4、5、6;答案①Yes;②No)
編寫一個根據用戶鍵入的兩個操作數和一個運算符,由計算機輸出運算結果的程序。(★★★)
輸入一個年號,判斷它是否為閏年。
(★,If條件語句,測試數據①1900;②2000;③2008;答案:①No;②Yes;③Yes)
編程計算S=1+2+3+…+100。(★,循環語句, 答案:5050)
相關練習:(1); (2);
(3); (4);
(相關練習答案:(1)5.19(保留2為小數);(2)338350;(3)2550;(4)1717)
根據公式,計算圓周率的π值。
(★★,循環語句,測試數據n=10000;答案:3.1414971639)
program e;
var
i:longint;
s:real;
begin
writeln; s:=0;
for i:=1 to 10000 do s:=s+1/(i*i);
writeln(sqrt(6*s));
end.
計算n!。(n!=1×2×3×…×n,取n=10)
(★★,循環語句,10!=3628800)
已知一對兔子,每個月可以生一對小兔,而小兔過一個月后也可生一對小兔。即兔子的對數是:第一個月1對,第二個月2對,第三個月3對,第四個月5對,……,假設兔子的生育期是12個月,并且不死,問一年后,這對兔子有多少對活著的后代?(Fibonacci數列問題)
(★★,循環語句, 1、2、3、5、8、13、21、34、55、89、144、233;答案233)
求兩個整數a與b的最大公約數和最小公倍數。
(★,循環語句、If條件語句,測試數據16和24,最大公約數8,最小公倍數48)
利用格利高公式求π。,直到最后一項的值小于10-6為止。
(★★★,循環語句) (答案:3.1415946569E+00)
program e2_32;
var
n,fh:longint;
s,t,p:real;
begin
writeln; n:=1; s:=0; t:=1; fh:=1;
while (abs(t)>=1e-6) do
begin t:=fh/n; s:=s+t; n:=n+2; fh:=-fh; end;
p:=4*s;
writeln('pi=',p);
end.
相關練習:利用公式,求π。
(計算前10000項時,答案為3.1415426536)
program e;
var
i,a,b:longint;
x,s:real;
begin
writeln; s:=0;
for i:=1 to 10000 do begin a:=(4*i-3); b:=(4*i-1); s:=s+1/(a*b); end;
writeln(8*s);
end.
求100~999中的水仙花數。(若三位數ABC,ABC=A3+B3+C3,則稱ABC為水仙花數。例如153,13+53+33=153,則153是水仙花數。) (★★,循環語句)
(答案:153、370、371、407)
program e12;
var
i,a,b,c:integer;
begin
writeln;
for i:=100 to 999 do
begin
a:=i div 100;
b:=(i mod 100) div 10;
c:=i mod 10;
if i=a*a*a+b*b*b+c*c*c then write(i:8);
end;
end.
試編寫能夠打印輸出如下圖形的程序。 (★★,循環語句)
AAAAAAAAA
AAAAAAA
AAAAA
AAA
A
program e;
const n=5;
var
i,j:integer;
begin
writeln;
for i:=1 to n do
begin
write('':i);
for j:=1 to (n-i)*2+1 do write('A');
writeln;
end;
end.
四個學生上地理課,回答我國四大淡水湖大小時這樣說: (★★★)
甲:“最大洞庭湖,最小洪澤湖,鄱陽湖第三。”
乙:“最大洪澤湖,最小洞庭湖,鄱陽湖第二,太湖第三。”
丙:“最小洪澤湖,洞庭湖第三。”
丁:“最大鄱陽湖,最小太湖,洪澤湖第二,洞庭湖第三。”
對于每個湖的大小,每個學生僅答對一個,請編程確定四個湖的大小。

習題部分:
已知三角形的兩邊a、b和夾角jc的值,求第三邊(已知條件由鍵盤輸入)。 (★)
(提示:余角公式)
(測試數據:輸入a=3、b=4、jc=90; 輸出5)
program e2_5;
var
a,b,c,jc:real;
begin
writeln('input a,b,jc:'); readln(a,b,jc);
c:=sqrt(a*a+b*b-2*a*b*cos(pi*jc/180));
writeln(c:8:2);
end.
編寫程序把一個四位整數3581顛倒成1853。 (★)
program e;
const n=3581;
var
a,b,c,d:integer;
begin
writeln;
a:=n mod 10;
b:=(n div 10) mod 10;
c:=(n div 100) mod 10;
d:=n div 1000;
writeln(a,b,c,d);
end.
相關練習:任意輸入一個正整數,顛倒輸出該數。
program e;
var
n:longint;
begin
writeln; writeln('input a integer number:'); readln(n);
repeat
write(n mod 10); n:=n div 10;
until n=0;
end.
輸入a、b、c三個數,打印出最大者。 (★,If條件語句)
program e;
var
a,b,c:real;
begin
writeln('input three number for a,b,c:');
readln(a,b,c);
if (a>b)and(a>c) then writeln(a);
else if (b>a)and(b>c) then writeln(b);
else writeln(c);
end.
從鍵盤讀入兩個數,比較其大小,把大數置于x,小數置于y。請設計實現該功能的程序。
(★,If條件語句)(程序略)
輸入三個數,判斷以這三個數為邊能否組成一個三角形。若不能,則給出適當信息;若能,則進一步判斷它們構的是銳角三角形、直角三角形還是鈍角三角形,并輸出其特征(等邊、等腰、直角、一般)、求其面積。 (★★,If條件語句)
(算法分析:對于判斷是銳角、直角、還是鈍角三角形,只需判斷最大邊的平方與其余兩邊的平方和的大小比較即可,小于則為銳角、等于則為直角、大于則為鈍角。)
(測試數據:①1、2、3;②3、4、5;③)4、4、7;④5、5、5;答案:①No;②直角、面積6.00;③鈍角、等腰、面積6.78;④銳角、等邊、面積10.83)
program e;
var
a,b,c,t,s,d,ja,jb,jc:real;
begin
writeln('input three number for a,b,c:');
readln(a,b,c);
if a if a if (a begin
if (a*a else if(a*a=b*b+c*c) then writeln('zhi jiao san jiao xing.')
else writeln('dun jiao san jiao xing.');
if (a=b)and(b=c)and(c=a) then writeln('deng bian san jiao xing.')
else if ((a=b)and(b<>c))or((a=c)and(c<>b))or((b=c)and(c<>a)) then
writeln('deng yao san jiao xing.')
else if (a*a<>b*b+c*c) then writeln('yi ban san jiao xing.');
d:=(a+b+c)/2; s:=sqrt(d*(d-a)*(d-b)*(d-c)); writeln('s=',s:0:2);
end
else writeln('NO!');
end.
設我國目前的人口為11億,且每年的增長率為1.5%。問多少年后,我國的人口會翻一番?(★) (答案:47)
program e2_22;
var
i:integer;
s:real;
begin
writeln; s:=11; i:=0;
while s<22 do
begin s:=s*(1.015); inc(i); end;
writeln(i);
end.
Fibonacci數列問題:數列的頭兩個數分別是0和1,從第三個數開始,每個數皆為它的前兩個數之和,即:0,1,1,2,3,5,…,輸出該數列的第50個數。 (★★,循環語句)
(答案:7778742049)
program e;
{$N+,E+}
var
i:integer;
x,y,z:extended;
begin
writeln; x:=0; y:=1; write(x:20:0,y:20:0);
for i:=3 to 50 do
begin z:=x+y; write(z:20:0); x:=y; y:=z; end;
end.
編寫程序求出下式中n的最大值:22+42+62+…+n2<1500。 (★★,循環語句)
(答案:18)
program e2_24;
var
n,s:integer;
begin
writeln;
s:=0; n:=0;
while s<1500 do
begin inc(n,2); inc(s,n*n); end;
writeln(n-2);
end.
把一元的鈔票換成一分、二分和五分的硬幣(每種至少一枚),問有多少種兌換方法?(★★)(答案:461)
program e2_29;
var
i,j,k,ans:integer;
begin
ans:=0;
for k:=1 to 19 do
for j:=1 to 47 do
for i:=1 to 93 do
if (k*5+j*2+i)=100 then inc(ans);
writeln(ans);
end.
編寫程序求最小正整數m、n(0(★★★★)
(算法:這類數字很大且有效數字位數很多(超出最多有效位數extended數據類型有效數字18位)的數字問題,一定要另辟蹊徑尋找突破口,注意到此題只要求最后三位數字相同,則我最多保留最后四位有效數字即可進行判斷。還請記住這樣一個事實,如1989×1989=3956121,3956121×1989=7868724669,最后四位數字是“4669”,而我把3956121取其最后的四位數“6121”與1989相乘即6121×1989=12174669,最后四位數字也是“4669”,沒有破壞最后四位有效數字的值,因此可以通過這種方法來編寫此程序。)
(答案:m=51; n=1);
program e;
var
m,n,i,j:integer;
x,y,a,b:longint;
begin
writeln;
for m:=2 to 60 do
for n:=1 to m-1 do
begin
x:=1; y:=1;
for i:=1 to m do begin x:=x mod 10000; x:=x*1989; a:=x mod 1000; end;
for j:=1 to n do begin y:=y mod 10000; y:=y*1989; b:=y mod 1000; end;
if a=b then writeln('m=',m,' n=',n);
end;
end.
編寫程序提示用戶輸入一系列整數,用0作結束標志,統計其中有多少個正數。 (★)
program e;
var
count,x:integer;
begin
writeln; writeln('input integer number(0--end):'); count:=0;
repeat
read(x);
if x>0 then inc(count);
until(x=0);
writeln('count=',count);
end.
求自然常數的值。(提示:0!=1,1!=1) (★★)
直到第50項;(2)直到最后一項小于10-5。
(答案:(1)2.71828182845905E+0000; (2)2.71828152557319E+0000)
(備注:第2小問程序略,只須將更改語句“until (1/s)<1E-5;”即可求的解答)
program e2_35;
{$N+}
var
i,count:integer;
e,s:extended;
begin
e:=1; count:=0;
repeat
inc(count); s:=1;
for i:=1 to count do s:=s*i;
e:=e+1/s;
until count=50;
writeln(e);
end.
三齊王點兵的故事。相傳三齊王韓信才智過人,從不直接清點自己軍隊的人數,只是讓士兵先后以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了(不超過100人)。輸入三次排尾的人數,輸出總人數。 (★★)
program e2_36;
var
a,b,c,i:integer;
begin
writeln('shu ru p3(0~2),p5(0~4),p7(0~6) de wei shu:');
readln(a,b,c);
for i:=100 downto 1 do
if (i mod 3=a)and(i mod 5=b)and(i mod 7=c) then writeln(i);
if i=1 then writeln('No answer!');
end.
編寫程序,計算N!以十進制數形式表示的數中最右的非零數字,并找出在它右邊有幾個零。例如12!=1×2×3×…×12=479001600。因此12!的右邊有2個零。 (★★★)
(提示:碰到5、52、53、54…才會出現末尾是零,所以1000!末尾零的個數為:
(1000 div 5)+(1000 div 52)+(1000 div 53)+(1000 div 54)=249)
(下面的程序沒采用上面的算法,采取另一種算法實現了這一程序,顯然上面的算法效率高)
(程序算法:只需提供末尾幾位有效數字即可,我采取提供四位有效數字相乘)
program I_11;
var
s:longint;
i,d:integer;
begin
writeln;
d:=0; s:=1;
for i:=1 to 1000 do
begin
s:=s*i;
if (s mod 1000 =0) then begin s:=s div 1000; d:=d+3; end;
if (s mod 100 = 0) then begin s:=s div 100; d:=d+2; end;
if (s mod 10 = 0) then begin s:=s div 10; d:=d+1; end;
s:=s mod 10000;
end;
writeln; write(d);
end.
編寫程序,輸出“字母塔”。以此類推共26層。 A (★★)
ABA
ABCBA
……………
program e2_40;
var
i,j:integer;
begin
writeln;
for i:=1 to 26 do
begin
for j:=1 to 26-i do write(' ');
for j:=1 to i do write(chr(64+j));
for j:=i-1 downto 1 do write(chr(64+j));
writeln;
end;
end.
第4章 數組類型
例題部分:
輸入10個整數,把這10個數按從小到大的順序排列。 (★★)
(冒泡法排序和選擇法排序兩種方法)
冒泡法排序:
program e1;
const n=10;
var
a:array[1..10] of integer;
i,j,t:integer;
begin
writeln('input ',n,' integer number:');
for i:=1 to n do read(a[i]);
for i:=1 to n-1 do
for j:=1 to n-i do
if a[j]>a[j+1] then begin t:=a[j]; a[j]:=a[j+1]; a[j+1]:=t; end;
for i:=1 to n do write(a[i]:5);
end.
折半查找。(二分法查找) (★★)
旅館里有一百個房間,從1到100編了號。第一個服務員把所有的房間門都打開了,第二個服務員把所有編號是2的倍數的房間“相反處理”,第三個服務員把所有編號是3的倍數的房間作“相反處理”,……,以后每個服務員都是如此。問第100個服務員來過后,哪幾扇門是打開的。(所謂“相反處理”是:原來開著的門關上,原來關上的門打開。) (★★)
(提示:對于任何一個編號,例如8,它的因子只有1、2、4、8,并且成對出現,當此數的因子數為偶數個時將被關上,當此數的因子數為奇數個時才會被打開。考慮到因子成對出現的情況,因此只有平方數的因子是奇數個的,所以門被打開的只能是平方數的房間,如1,4等)
編寫程序把任意十進制整數轉換成二進制整數。 (★★)
所謂“幻方”,是一個行、列為奇數的方陣,把1~n2這n2個不同的數放入方陣中,使方陣的每行、每列和每個對角線上的元素的和全部相等。下面給出幻方的一種排列方法:
先把1放在第一行的中間位置;
下一個數放在上一個數的右上方;
若右上方已超出方陣的第一行,則下一個數放在下一列的最后一行上;
若右上方已超出方陣的最后一列,則下一個數放在上一行的第一列上;
若右上方已經有數,或右上方已超出方陣的第一行最后一列,則下一個數放在上一個數的正下方。
編寫程序,對輸入小于15的n,打印出相應的幻方。 (★★★)
在一個字符數組LET中形成由A開始的連續26個大寫字母構成的字串,并將其倒置后仍放在LET中。
隨機輸入一個長度不超過255的字符串,將其倒置后輸出。
隨機輸入一些國家的英文名字,以end作為輸入結束標志,按字母順序排序后輸出。
求n個字符串的最長公共子串,n<20,字符長度不超過255。
例如n=3,由鍵盤依次輸入三個字符串為:
what is local bus?
Name some local bus.
Local bus is high speed I/O bus close to the processor.
則最長公共子串為“local bus”。
文本的整版。編寫一個程序,從鍵盤以任意的方法輸入句子,然后打印出來。打印時每行寬度必須為n個字符。如果一行的最后一個單詞超出了本行n個字符的范圍,則應把它移到下一行去。輸入一個句子測試你的程序。
習題部分:
輸入n個整數,請找出最小數所在的位置,并把它與第一個數對調。 (★)
program e4_2;
var
a:array[1..10]of integer;
i,t,y:integer;
begin
writeln('input ten integer number:');
for i:=1 to 10 do read(a[i]);
t:=a[1];
for i:=2 to 10 do if a[i] for i:=1 to 10 do
if a[i]=t then begin writeln('the min number is ',i,'th'); a[i]:=a[1]; a[1]:=t; end;
for i:=1 to 10 do write(a[i]:8);
end.
用邊排序邊合并的方法把兩個有序數列合并為一個新的有序數列,不得先合并再重新排序。
(★★)
(測試數據:這里a組數據共8個:1 1 3 6 6 7 9 10; b組數據共5個:0 1 2 3 4)
program e4_3;
var
a:array[1..8] of integer;
b:array[1..5] of integer;
c:array[1..13] of integer;
i,j,k,m,n:integer;
begin
writeln('input 8 integer number of square arrayA:');
for i:=1 to 8 do read(a[i]);
writeln('input 5 integer number of square arrayB:');
for i:=1 to 5 do read(b[i]);
j:=1; k:=1; m:=a[j]; n:=b[k];
for i:=1 to 13 do
begin
if m begin
c[i]:=m; inc(j); m:=a[j];
if j=9 then m:=maxint;
end
else
begin
c[i]:=n; inc(k); n:=b[k];
if k=6 then n:=maxint;
end;
end;
for i:=1 to 13 do write(c[i]:4);
end.
將一個數插入到有序的數列中,插入后數列仍然有序。 (★★)
(測試數據:有序數組為1 1 3 6 6 7 9 10; 待插入數為5)
program e4_4;
var
i,j,n:integer;
flag:boolean;
a:array[1..9] of integer;
begin
writeln('input 8 integer square number:');
for i:=1 to 8 do read(a[i]);
writeln('input a integer number to insert:');
readln(n);
flag:=false; i:=1;
repeat
if a[i]>n then flag:=true else inc(i);
until flag=true;
for j:=9 downto i+1 do a[j]:=a[j-1];
a[i]:=n;
for i:=1 to 9 do write(a[i]:4);
end.
有N個無序的數存放在A數組中,請將后面相同的數刪成只剩下一個,并輸出經過刪除后的數列。 (★★)
(測試數據:數列為1 3 5 3 7 5 3 1; 答案:1 3 5 7)
program e4_5;
var
a:array[1..8] of integer;
i,j,n:integer;
begin
writeln('input 8 integer number:');
for i:=1 to 8 do read(a[i]);
for i:=2 to 8 do
for j:=1 to i-1 do if a[i]=a[j] then a[i]:=maxint;
for i:=1 to 8 do
if a[i]<>maxint then write(a[i]:4);
end.
有N個人排隊到R個相同的水龍頭去打水,他們裝滿各自水桶的時間T1、T2、…、TN為整數且互不相等,應如何安排他們打水的順序才能使他們花費的總時間最少?(花費的總時間等于每個花費時間的總和)
求一個五階方陣中某個元素的位置:它在行上是最小的,在列上也是最小的,如果沒有請輸出“NO FIND!”。 (★★★)
(分析:整個矩陣中的最小值,當然也是所在行和所在列的最小值,因此肯定能找到這樣的數)測試數據: 答案:2、1、3、6
11
4
2
7
8
5
9
23
1
25
3
22
21
18
15
17
16
24
12
6
13
10
19
20
14
program e;
var
i,j,x,y:integer;
minx:integer;
a:array[1..5,1..5] of integer;
begin
writeln; writeln('input number(5*5):');
for i:=1 to 5 do
for j:=1 to 5 do
read(a[i,j]);
for i:=1 to 5 do
begin
minx:=a[i,1]; x:=i; y:=1;
for j:=1 to 5 do
if a[i,j] for j:=1 to 5 do
if a[j,y] if j=5 then writeln('the number is ',minx,'[',x,']','[',y,']');
end;
end.
第5章 過程與函數
例題部分:
編程求:1!+3!+5!+7!+9!+11!。
求數字的乘積根。一個正整數的數字的乘積N的定義是:這個整數中非零數字的乘積。例如,整數999的數字乘積為9×9×9,即729。729的數字乘積為7×2×9,即126。126的數字乘積為1×2×6,即12。12的數字乘積為1×2,即2。一個正整數的數字乘積根N是這樣得到的:反復取該整數的數字乘積,直到得到一位數字為止。例如,在上面的例子中數字的乘積根是2。編寫一個程序,輸入一個正整數(長度不超過200位數字),輸出計算其數字乘積根的每一步結果。
漢諾(Hanoi)塔問題。設有n個大小不等的中空圓盤,按照從小到大(尺寸和序號)的順序疊套在立柱A上。另有兩根立柱B和C,如圖所示。問題要求把全部圓盤從A柱(源柱)移到C柱(目標柱)。移動過程中可借助B柱(中間柱)。移動時有如下要求:
一次只能移動一個圓盤;
不允許把大盤放在小盤上邊;
可使用任意一根立柱暫存圓盤。
把一個十進制整數轉化為K進制數(K≤10)。
八皇后問題:把八個皇后擺在8×8國際象棋棋盤格子內,使它們互不捕獲對方。換言之,在任何一行、一列或一條對角線上,僅能放置一個皇后。這一問題是由19世紀著名數學家高斯(Gauss)于1850年首先提出的。(答案共有92種解答)
已知:切比雪夫多項式如下: (提示:運用遞歸函數計算)

對給定的不同的正整數,它是一些階數不同的多項式,編程計算第n個多項式的值。
習題部分:
編寫一遞歸函數說明,用以計算組合數C(M,N)。(即)
兩個人玩井字游戲,在井字進分的九個空位上輪流畫O或*,誰最先使自己的三個O或三個*在一條直線上,誰就贏了。編寫程序檢查每一步是否走得正確,并告訴誰是勝利者。
第6章 集合與記錄類型
例題部分:
七段數碼管問題。
任意給出一個正整數N,找一個正整數M,使得N*M的值的數字由0、1、…、C(C≤9)組成,且這些數字至少出現一次。編寫程序在整數范圍內找出滿足條件的最小M。若沒有給出信息,則輸出“No find!”。
例如:C=3、N=65時,M=48,65×48=3210;
C=8、N=125時,“No find!”。
(以下程序設計試題來自《計算機二級考試復習指南》)
數列稱為e數列, (★★)
每一個e(n)(n=1,2,…)稱為e數。求[1,30000]之內:
最大的e數;(2)e數的數目。
(該數列前面幾項為1、1、3、11、53、……; 答案:①16687; ②8)
program e;
var
a,b,c,n:longint;
begin
writeln; n:=3; a:=1; b:=1;
repeat
c:=(n-2)*a+(n-1)*b; a:=b; b:=c; inc(n);
until c>30000;
writeln('maxe=',a,' count=',n-2);
end.
計算并輸出:之值(精確到小數點后第5位)。 (★)
(答案:0.99900)
program e;
var
i:integer;
s,n:real;
begin
writeln; s:=0;
for i:=1 to 1000 do begin n:=i; s:=s+1/(n*(n+1)); end;
writeln(s:0:5);
end.
已知,求: (★★)
F(50);(2)F(0)+F(1)+……+F(50)。
(答案:①212101; ②-97262)
program e;
var
i,a,b,c,d,s:longint;
begin
writeln; a:=1; b:=1; c:=1; s:=3;
for i:=3 to 50 do
begin d:=a-2*b+c; s:=s+d; a:=b; b:=c; c:=d; write(d:8); end;
writeln; writeln('s=',s);
end.
求滿足:A·B=716699并且A+B最小兩個條件的A和B。 (★★★)
(答案:A=563; B=1273)
program e;
var
a,x,s,mina,minb:longint;
begin
writeln; s:=716699; x:=trunc(sqrt(716699));
for a:=1 to x do
if (716699 mod a=0)and(a+(716699 div a) begin s:=a+(716699 div a); mina:=a; minb:=(716699 div a); end;
writeln('A=',mina,' B=',minb);
end.
一自然數平方的末幾位與該數相同時,稱此數為自同構數。例如,由于52=25,則稱5為自同構數。求出[1,700]以內的:(1)最大的自同構數;(2)自同構數數目。 (★★)
(答案:①625 ②)7)
program e;
var
i,count:longint;
begin
writeln; count:=0;
for i:=1 to 9 do
if (i*i-i) mod 10=0 then inc(count);
for i:=10 to 99 do
if (i*i-i) mod 100=0 then inc(count);
for i:=100 to 700 do
if (i*i-i) mod 1000=0 then begin inc(count); write(i:8); end;
writeln; writeln('count=',count);
end.
若某不含數字0的三位正整數,其平方數至少有三位同樣的數字,則稱該三位數為三重數。例如,由于:5112=261121(有三位1),所以511為三重數。求出: (★★★★)
(1)按升序排列第10個三重數;(2)按升序排列前10個三重數之和;
(答案:(1)258; (2)1826)
program e1;
var
i,j,k,a,b,c,x,n,count,s:longint;
aa:array[1..5]of integer;
begin
writeln;
s:=0; count:=0;
for i:=111 to 316 do
begin
a:=i div 100; b:=(i div 10) mod 10; c:=i mod 10;
if ((a<>0)and(b<>0)and(c<>0)) then
begin
x:=i*i;
aa[1]:=x div 10000;
aa[2]:=(x div 1000) mod 10;
aa[3]:=(x div 100) mod 10;
aa[4]:=(x div 10) mod 10;
aa[5]:=x mod 10;
for j:=1 to 3 do
begin
n:=1;
for k:=j+1 to 5 do
if aa[j]=aa[k] then n:=n+1;
if n>2 then begin writeln(i:8,x:8); s:=s+i; count:=count+1; break; end;
end;
end;
if count=10 then break;
end;
writeln(s:8);
end.
滿足下列兩個條件:(a)千位數字與百位數字相同(非0),十位數字與個位數字相同;(b)是某兩位數的平方。的四位正整數稱為四位平方數。例如,由于:7744=882,則稱7744為四位平方數。求出:(1)所有四位平方數的數目;(2)所有四位平方數之和。 (★★)
(分析:最小四位數1000是31.6的平方,最大的四位數9999是99.9的平方)
(答案:①1; ②7744)
program e;
var
i,x,count,s:longint;
begin
writeln; count:=0; s:=0;
for i:=32 to 99 do
begin
x:=i*i;
if ((x div 1000)=((x div 100) mod 10))and(((x div 10) mod 10)=(x mod 10)) then
begin inc(count); s:=s+x; end;
end;
writeln('count=',count,' s=',s);
end.
其平方等于某兩個正整數平方之和的正整數稱為弦數。例如,由于32+42=52,因此5為弦數。求[121,130]之間:(1)弦數數目;(2)最小的弦數;(3)最大的弦數。 (★★★)
(分析:設a2+b2=c2,且a(答案:①4; ②122; ③130)
program e;
var
i,j,k,x,count:longint;
begin
writeln; count:=0;
for i:=121 to 130 do
begin
x:=trunc(sqrt(i*i/2));
for j:=1 to x do
begin
k:=trunc(sqrt(i*i-j*j));
if (i*i=j*j+k*k) then
begin inc(count); writeln(i,'*',i,'=',j,'*',j,'+',k,'*',k); break; end;
end;
end;
writeln('count=',count);
end.
求滿足以下三個條件:(a)X2+Y2+Z2=512;(b)X+Y+Z之值最大;(c)X最小。的一組X、Y、Z的值。 (★★★★)
(答案:X=22; Y=31; Z=34)
program e1;
var
x,y,z,n,m,maxs,minx,xx,yy,zz:integer;
begin
writeln;
n:=trunc(sqrt(51*51/3)); m:=trunc(sqrt((51*51-1*1)/2));
maxs:=0; minx:=51;
for x:=n downto 1 do
for y:=x to m do
begin
z:=trunc(sqrt(51*51-x*x-y*y));
if (z>y)and(x*x+y*y+z*z=51*51) then
if ((x+y+z>maxs)or((x+y+z)=maxs)) then
begin
maxs:=x+y+z; xx:=x; yy:=y; zz:=z;
end;
end;
writeln('x=',xx,' y=',yy,' z=',zz);
end.
計算(精度10-4)(a=0.1、x=1.0)。 (★)
(答案:0.0295)
program e;
var
y,a,x:real;
begin
writeln; a:=0.1; x:=1.0;
y:=(exp(a*x)-exp(-a*x))/2*sin(x+a)+a*ln((x+a)/2);
writeln(y:0:4);
end.
倒勾股數是滿足下列公式:(設A>B>C)的一組(3個)整數(A、B、C),例如(156,65,60)是倒勾股數,因為。問: (★★)
(1)A、B、C之和小于100的倒勾股數有多少組?
(2)滿足(1)的諸組中,A、B、C之和最小的是哪組?
(提示:把公式轉化為A2B2=C2(A2+B2))
(答案:①2; ②a=20, b=15, c=12)
program e;
var
a,b,c,count,mins,mina,minb,minc:longint;
begin
writeln; count:=0; mins:=100;
for c:=1 to 33 do
for b:=c+1 to 49 do
for a:=b+1 to 97 do
if (a*a*b*b=c*c*(a*a+b*b))and(a+b+c<100) then
begin
inc(count);
if (a+b+c end;
writeln('count=',count,' a=',mina,' b=',minb,' c=',minc);
end.
設有十進制數字a、b、c、d、e,求在滿足下列式子:abcd×e=dcba(a非0,e非0非1)的四位數abcd中,求滿足條件的最小的abcd和與之對應的e。 (★★)
(答案:1089; 9)
program e1;
var
a,b,c,d,e,x,y:longint;
begin
writeln;
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do
for e:=2 to 9 do
begin
x:=a*1000+b*100+c*10+d; y:=d*1000+c*100+b*10+a;
if (x*e=y) then begin writeln(x:8,e:8); exit; end;
end;
end.
求方程:在區間(0,1)內的解,精度為10-4。 (★★)
(答案:0.3473)
program e;
var
x:real;
begin
writeln; x:=0.0001;
repeat
if (abs(x*x*x-3*x+1)<1e-4) then writeln(x:0:4);
x:=x+0.0001;
until x>=1;
end.
按遞增順序產生序列M中最小的80個數。M定義如下:數1屬于M;若x屬于M,則y=2x+1,z=3x+1也屬于M,并求: (★★★★)
該序列第50個元素之值;(2)該序列前50個元素之和。
(答案:(1)172; (2)3853)
program e;
var
i,j,k,t,p,n:longint;
a:array[1..100] of longint;
begin
writeln;
p:=1; a[p]:=1; n:=1;
while p<50 do
begin
a[n+1]:=2*a[p]+1;
a[n+2]:=3*a[p]+1;
n:=n+2;
for i:=1 to n-1 do
for j:=1 to n-i do
if a[j]>a[j+1] then
begin t:=a[j]; a[j]:=a[j+1]; a[j+1]:=t; end;
p:=p+1;
end;
writeln(a[p]:8);
end.
在n個一連串的方格內填寫字母A或B,但相鄰兩格內不能都填B。求所有可能的填寫方案數。例如,當n=3,可能的方案有AAA、AAB、ABA、BAA、BAB等5種。試求:(1)當n=15時,所有可能的方案數是多少?(2)當n=10時,包含有8個字母A的方案數共有多少?(★★★)
(提示:此題可以采用進制轉換來解決。考慮到只包含了A與B兩個字母,我們可以用二進制的0和1來代替,所以當全部是A時最小,此數為0,當全部是B時最大為2 n-1,我們讓變量從0~2 n-1循環,然后將此數轉換為相應的二進制數存儲在數組中即可進行判斷了。)
(答案:(1)1597; (2)36)
program e;
var
n,m,s,i,j,count:longint;
flag:boolean;
a:array[1..100] of integer;
begin
writeln('input n:');
readln(n);
s:=1; count:=0;
for i:=1 to n do s:=s*2;
for i:=0 to s-1 do
begin
m:=i;
for j:=1 to n do
begin
a[j]:=m mod 2;
m:=m div 2;
end;
flag:=true;
for j:=1 to n-1 do
if (a[j]=1)and(a[j+1]=1) then
begin flag:=false; break; end;
if flag=true then count:=count+1;
end;
writeln(count);
end.
program e;
var
n,m,s,i,j,count,na:longint;
flag:boolean;
a:array[1..100] of integer;
begin
writeln('input n:');
readln(n);
s:=1; count:=0;
for i:=1 to n do s:=s*2;
for i:=0 to s-1 do
begin
m:=i;
for j:=1 to n do
begin
a[j]:=m mod 2;
m:=m div 2;
end;
flag:=true;
for j:=1 to n-1 do
if (a[j]=1)and(a[j+1]=1) then
begin flag:=false; break; end;
na:=0;
for j:=1 to n do
if a[j]=0 then
na:=na+1;
if (flag=true)and(na=8) then count:=count+1;
end;
writeln(count);
end.
給定自然數1到n的集合和自然數m(m>n),求各元素之和等于m的子集。(設n=20,m=48)。(1)共有多少個符合上述條件的子集?(2)符合上述條件且子集元素數目為5的子集有多少?
(★★★)
(提示:集合的元素不能重復,此題可分3~9個元素類別集合討論,下面給出第2問的源程序)
(答案:①1674; ②488)
program e1;
const
m=48;
var
a,b,c,d,e,f,g,count:integer;
begin
writeln; count:=0;
for a:=1 to trunc(m/5) do
for b:=a+1 to trunc((m-1)/4) do
for c:=b+1 to trunc((m-1-2)/3) do
for d:=c+1 to trunc((m-1-2-3)/2) do
for e:=d+1 to 20 do
if (a+b+c+d+e=m) then inc(count);
writeln('count5=',count);
end.
(以下程序設計試題來自《全國青少年信息學奧林匹克聯賽――培訓習題與解答(中學)》)
計算1×2+3×4+5×6+……+49×50的值。 (★)
(答案:21450)
program e;
var
i,x,s:longint;
begin
writeln; s:=0; x:=0;
for i:=1 to 25 do begin x:=x+2; s:=s+x*(x-1); end;
writeln(s);
end.
給定一串整數數列,求出所有的遞增和遞減子序列的數目。例如數列7、2、6、9、8、3、5、2、1可分為(7,2)、(2,6,9)、(9,8,3)、(3,5)、(5,2,1)五個子序列,答案就是5。我們稱2、9、3、5為轉折元素。 (★★★)
program e;
var
a:array[1..9] of integer;
i,j,k,n:integer;
begin
writeln('input 9 number');
for i:=1 to 9 do read(a[i]);
n:=1;
for i:=2 to 9-1 do
if ((a[i]a[i-1])and(a[i]>a[i+1])) then
n:=n+1;
writeln(n:8);
end.
將1~9這9個數字分成三組(每個數字只能使用一次),分別組成三個三位數,且這三個三位數的值構成1:2:3的比例,試求出所有滿足條件的三個三位數。 (★★★)
(分析:注意下面源程序所采用的算法,非常好)
(答案:(192、384、576)、(219、438、657)、(273、546、819)、(327、654、981))
program e;
var
a:array[0..9] of integer;
i,g,s,b,k,t:integer;
begin
writeln;
for i:=100 to 333 do
begin
for k:=0 to 9 do a[k]:=0;
k:=i;
g:=k mod 10; s:=(k div 10) mod 10; b:=k div 100; a[g]:=1; a[s]:=1; a[b]:=1;
k:=2*i;
g:=k mod 10; s:=(k div 10) mod 10; b:=k div 100; a[g]:=1; a[s]:=1; a[b]:=1;
k:=3*i;
g:=k mod 10; s:=(k div 10) mod 10; b:=k div 100; a[g]:=1; a[s]:=1; a[b]:=1;
t:=0;
for k:=1 to 9 do t:=t+a[k];
if t=9 then writeln(i:4,i*2:4,i*3:4);
end;
end.
回文算術:任給一個三位數abc,算出abc與cba之和。若該和數不是回文數(回文數的定義是從左讀和從右讀一樣,如5、121、1221等),再按上述方法求和。以此類推,直到得到回文形式的和數或者和數的位數已經超過15位時中止計算。 (★★★)
(分析:注意此題中處理回文數判斷的方法和處理數組高精度加法的方法)
program e;
var
a,b:array[1..20] of integer;
x,i,m:integer;
hw:boolean;
begin
writeln; write('abc='); readln(x);
for i:=1 to 15 do a[i]:=0;
a[1]:=x mod 10; a[2]:=(x div 10) mod 10; a[3]:=x div 100;
m:=3; hw:=false;
while (hw=false)and(m<15) do
begin
for i:=1 to m do b[i]:=a[m-i+1];
i:=1;
while (i<=m)and(a[i]=b[i]) do i:=i+1;
if i>m then hw:=true
else
begin
for i:=m downto 1 do write(a[i]);
write('+');
for i:=m downto 1 do write(b[i]);
write('=');
for i:=1 to m do
begin a[i]:=a[i]+b[i]; a[i+1]:=a[i+1]+a[i] div 10; a[i]:=a[i] mod 10; end;
if a[m+1]>0 then m:=m+1;
for i:=m downto 1 do write(a[i]);
writeln;
end;
end;
if hw then writeln('success!') else writeln('Fail!');
end.
求一個n×n數陣中的馬鞍數,輸出它的位置。所謂馬鞍數,是指在行上最小而在列上最大的數。
(★★)
(測試數據:(矩陣1) (矩陣2)
15
4
14
25
7
11
4
2
7
8
11
9
23
16
8
5
9
23
1
25
22
3
21
18
5
3
22
21
18
15
17
1
24
12
6
17
16
24
12
6
13
10
19
20
2
13
10
19
20
14
program e;
const n=5;
var
i,j,min,x,y:integer;
flag:boolean;
a:array[1..n,1..n] of integer;
begin
writeln; writeln('input ',n,'*',n,' integer number:');
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
flag:=false;
for i:=1 to n do
begin
min:=a[i,1]; x:=i; y:=1;
for j:=1 to n do
if a[i,j] for j:=1 to n do
if a[j,y]>a[x,y] then break;
if (j=n)and(a[x,y]>a[n,y]) then begin write(a[x,y],'(',x,',',y,')'); flag:=true; end;
end;
if flag=false then writeln('No find!');
end.
數學黑洞6174。已知:一個任意的四位正整數(全相同的除外,如1111)。將數字重新組合成一個最大的數和最小的數相減,重復這個過程,最多七步,必得6174。即:7641-1467=6174。將永遠出不來。
求證:所有四位數數字(全相同的除外),均能得到6174。輸出掉進黑洞的步數。 (★★★)
program e18;
var
a:array[1..4] of integer;
i,j,d,k:integer;
begin
writeln('input a si wei shu:');
read(d);
if (d mod 1111<>0) then
while d<>6174 do
begin
a[1]:=d div 1000; a[2]:=(d mod 1000) div 100;
a[3]:=(d mod 100) div 10; a[4]:=d mod 10;
for i:=1 to 4 do
for j:=i+1 to 4 do
if a[i] begin
k:=a[i]; a[i]:=a[j]; a[j]:=k;
end;
d:=1000*a[1]+100*a[2]+10*a[3]+a[4]-1000*a[4]-100*a[3]-10*a[2]-a[1];
writeln(1000*a[1]+100*a[2]+10*a[3]+a[4],'-',1000*a[4]+100*a[3]+10*a[2]+a[1],'=',d);
end;
end.
(以下程序設計試題來自《青少年信息學競賽題庫》)
輸入10個正整數,計算它們的和,平方和。 (★)
program I_1;
var
i,s,d,p:integer;
begin
writeln('input ten positive number:');
s:=0; p:=0;
for i:=1 to 10 do
begin
read(d);
s:=s+d; p:=p+d*d;
end;
writeln;
write(s:8,p:8);
end.
統計1——999中能被3整除,且至少有一位數字是5的數。 (★)
(答案:91)
program I_4;
var
i,s:integer;
begin
writeln; s:=0;
for i:=1 to 999 do
begin
if(i mod 3 = 0) and ((i mod 10 = 5) or ((i div 10) mod 10 =5) or ((i div 100)=5))
then begin write(i:8); s:=s+1; end;
end;
writeln; write(s:8);
end.
從鍵盤輸入一個20~50之間的整數,統計出邊長為整數,周長為輸入數的不等邊三角形的個數。
(測試數據:輸入27, 輸出18) (★★)
program I_9;
var
x,y,z,k,s:integer;
begin
writeln; writeln('input a integer number(20 k:=0;
for x:=1 to (s div 3) do
for y:=x to ((s-x) div 2) do
begin
z:=s-x-y;
if (x+y)>z then
begin
writeln(x:4,y:4,z:4); k:=k+1;
end;
end;
if (s mod 3)=0 then k:=k-1;
write(k);
end.
一個整數的立方可以表示為兩個整數的平方差,如19853=19711052-19691202。 編程:輸入一個整數N,自動將其寫成N3=X2-Y2。 (★★★)
(提示:N3=X2-Y2=(X+Y)(X-Y),所以必有(X-Y)=N,(X+Y)=N2。)
(測試數據:N=2004; 答案20043=20090102-20070062)
program I_13;
var
n,x,y:longint;
begin
writeln; read(n);
for y:=1 to maxlongint do
begin
x:=y+n;
if (n*n=x+y) then begin writeln(n,'︿3=',x,'︿2-',y,'︿2'); exit; end;
end;
end.
任意給定平面上三個點A(X1,Y1),B(X2,Y2),C(X3,Y3),試判斷這三個點能否構成三角形。能則求出它的面積。 (★★)
(測試數據:
program I_16;
var
x1,y1,x2,y2,x3,y3,a,b,c,d,e,k:real;
begin
writeln; write('input X1,Y1 X2,Y2 X3,Y3:');
read(x1,y1,x2,y2,x3,y3);
a:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
b:=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
c:=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
if a if a if a begin d:=(a+b+c)/2; e:=sqrt(d*(d-a)*(d-b)*(d-c)); write('area=',e:8:3); end
else write('bu neng gou cheng san jiao xing');
end.
59=32+52+52=12+32+72,即59可以分別等于兩組不同的自然數(每組各3個數)的二次冪之和,請找出10個最小的具有這種特性的數。 (★★★)
(分析:注意此程序中Goto語句的用法)
(答案:(27、1、1、5、3、3、3)(33、1、4、4、2、2、5)(38、1、1、6、2、3、5)等)
program e;
label 1;
var
m,a,b,c,n,a1,b1,c1,count:integer;
begin
writeln; count:=0; m:=0;
1:repeat
begin
inc(m);
if count>=10 then exit;
n:=0;
for a:=1 to trunc(sqrt(m/3)) do
for b:=a to trunc(sqrt((m-a*a)/2)) do
for c:=b to trunc(sqrt(m-a*a-b*b)) do
if (a*a+b*b+c*c>m) then goto 1
else if (a*a+b*b+c*c=m) then
begin
inc(n);
if n=1 then begin a1:=a; b1:=b; c1:=c; end
else if n=2 then
begin
inc(count);
writeln(m:4,a1:4,b1:4,c1:4,a:4,b:4,c:4);
goto 1;
end;
end;
end;
until count>=10;
end.
每一個素數的倒數都可以化為一個循環小數,例如:1/7可以化為0.(142857),1/13可化為
0.(076923)。編程把17的倒數化為循環小數。 (★★)
(答案:0.(0588235294117647))
program I_25;
var
a,b,c,i,j,k:integer;
e:array[1..200] of integer;
yes:boolean;
begin
writeln;
a:=1; b:=17;
for i:=1 to 200 do
begin
c:=a*10 div b;
a:=10*a mod b;
e[i]:=c;
end;
for i:=1 to 200 do
for j:=i+1 to 200 do
if (e[i]=e[j]) then
begin
yes:=true;
for k:=1 to j-i do
if e[i]<>e[j] then yes:=false;
if yes=true then
begin
for k:=i to j-1 do
write(e[k]);
halt;
end;
end;
end.
求數列1、5、17、53、161、。。。前20項的和。(提示: An=2+3×An-1) (★★)
(答案:3486784380)
program I_29;
var
an,am,s:real;
i:integer;
begin
writeln; am:=1; s:=1; write(am:20:0);
for i:=2 to 20 do
begin
an:=am*3+2; s:=s+an; am:=an; write(am:20:0);
end;
writeln; write('totle:',s:0:0);
end.
編一程序實現:由鍵盤輸入年月日后,計算機能打印出該日期是星期幾。 (★★)
(提示:首先算出這一年的元旦是星期幾。算法如下:①輸入年份year;②根據下面公式計算:
d=year+((year-1)div 4)-((year-1)div 100)+((year-1)div 400)
d=d mod 7;那么d=0則表示為Sunday、d=1則表示為Monday、……依此類推。
③輸入月份month和日期day,計算該日期是這個年份中的第幾天(x);
④計算(x+d-1)mod 7,得到星期幾。
注意月份中的二月是28天還是29天,需看年份是否為閏年,閏年定義為:年份能被400整除的是閏年,或者年份能被4整除但不能被100整除的是閏年,其它年份均不為閏年。閏年的計算方法如下:若((year mod 4=0)and(year mod 100<>0))or(year mod 400=0)則為閏年。)
program e;
const
yd:set of 1..12=[1,3,5,7,8,10,12]; {月大的月份}
yx:set of 1..12=[4,6,9,11]; {月小的月份}
a:array[1..12] of integer=(0,31,59,90,120,151,181,212,243,273,304,334);
{a數組存放第i個月份的前i-1個月的天數}
{因為這12個月的天數分別為31,28,31,30,31,30,31,31,30,31,30,31,故前i-1個月的天數為不斷疊加}
s:array[0..6] of string=
('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var
year,m,day,d,x:integer;
r,flag:boolean;
begin
writeln('input year:'); readln(year);
if (year mod 400=0)or((year mod 4=0)and(year mod 100<>0)) then r:=true else r:=false;
repeat
writeln('input month:'); readln(m);
until (m in [1..12]);
flag:=false;
repeat
writeln('input day:'); readln(day);
if (m in yd)and(day in [1..31]) then flag:=true
else if (m in yx)and(day in [1..30]) then flag:=true
else if (m=2)and(r=true)and(day in [1..29]) then flag:=true
else if (m=2)and(r=false)and(day in [1..28]) then flag:=true;
until flag=true;
d:=year+((year-1) div 4)-((year-1) div 100)+((year-1) div 400); {按公式計算d}
d:=d mod 7; {得到元旦為星期幾}
x:=a[m]+day; {x表示該天是該年的第幾天}
if (m>2)and(r=true) then x:=x+1; {如果月份大于二月且該年為閏年,那么天數需要多加一天}
x:=(x-1+d) mod 7; {x-1表示在元旦的基礎上,該天是第多少天}
writeln('Today is ',s[x]);
end.
編程實現:鍵盤輸入年月,計算機能打印出該月的月歷,如輸入2004、6,則輸出: (★★★)
SUM
MON
TUE
WED
THU
FRI
SAT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
program e;
const
yd:set of 1..12=[1,3,5,7,8,10,12]; {月大的月份}
yx:set of 1..12=[4,6,9,11]; {月小的月份}
a:array[1..12] of integer=(0,31,59,90,120,151,181,212,243,273,304,334);
var
year,m,day,d,x,i:integer;
r:boolean;
begin
writeln('input year:'); readln(year);
if (year mod 400=0)or((year mod 4=0)and(year mod 100<>0)) then r:=true else r:=false;
repeat
writeln('input month:'); readln(m);
until (m in [1..12]);
if m in yd then day:=31
else if m in yx then day:=30
else if (m=2)and(r=true) then day:=29
else day:=28;
d:=year+((year-1) div 4)-((year-1) div 100)+((year-1) div 400); {按公式計算d}
d:=d mod 7; {得到元旦為星期幾}
x:=a[m]; {x表示該月是的前m-1個月的天數}
if (m>2)and(r=true) then x:=x+1; {如果月份大于二月且該年為閏年,那么天數需要多加一天}
x:=(x-1+d) mod 7; {x-1表示在元旦的基礎上,該天是第多少天,x表示上個月最后一天是星期幾}
writeln('SUM':4,'MON':4,'TUE':4,'WED':4,'THU':4,'FRI':4,'SAT':4);
for i:=0 to x do write('':4); {上個月占用的星期用空格輸出}
for i:=1 to day do
begin
if (i+x) mod 7=0 then writeln;
write(i:4);
end;
end.
寫出兩個1,然后在它們中間插入2,成121;下一步是在上面數中每兩個相鄰的和數為3的數之間插入3,成為13231;再下一步又在上面數中任意兩個相鄰的和數為4的數中插入4,成為1432341;由鍵盤輸入N,求出用上面方式構造出來的序列,其最后插入的數是N。假設這個序列不超過1000項,給出N=9時的運算結果。
把所有3的方冪及不相等的3的方冪的和排列成遞增序列:1、3、4、9、10、12、13、。。。這個序列的第300項是多少?(6840)
兩個1,兩個2,兩個3,這6個數可組成6位數312132。這個數有如下特點:兩個1之間隔一位,兩個2之間隔兩位,兩個3之間隔3位。231213也是一個符合條件的6位數。用數字1、2、3、4、5、6、7、8各兩個,可以組成類似的16位數,請找出10個這樣的16位數。
對于所有的數字不完全相同的三位數(不夠三位數的前面補零也當成是三位數)。我們定出如下計算規則:用這個三位數的三個數字可組成的最大數減去可組成的最小數,則得到一個新的三位數;對新的三位數還按照上面的規則繼續算下去,最后會發現,我們陷入一個死循環里,或者說是跌入了一個數的黑洞里。用具體例子說明。比如從三位數123開始,計算如下321-123=198;981-189=792;972-279=693;963-369=594;954-459=495;954-459=495;…. 從其他的任何三位數開始,最終也都會停止在495,我們把495叫做三位數的黑洞。類似地也存在著一個由一個數組成的四位數的黑洞。請編程序把它找出來。(6174)
(答案:與前面的數學黑洞問題相似,故此程序略)
11,323,74947,63144136這樣的數叫回文數,它們的特點是最高位、最低位的數相同,次高位,次低位相同,….其中11是個更特殊的回文數,它的平方121、立方1331也是回文數。這是最小的一個具有這種性質的回文數。請編程,找出三次方小于999999999的具有上述性質的所有回文數。
(答案:1、2、11、101、111) (★★)
program e;
var
i:longint;
fun_ction huiwen(x:longint):boolean;
var
a,b:array[1..100] of integer;
m,n,y:longint;
hw:boolean;
begin
if x<1 then begin huiwen:=false; exit; end;
for m:=1 to 100 do a[m]:=0;
y:=x; m:=0;
repeat
inc(m); a[m]:=y mod 10; y:=y div 10;
until y=0;
for n:=1 to m do b[n]:=a[m+1-n];
n:=1;
while (n<=m)and(a[n]=b[n]) do inc(n);
if n=m+1 then huiwen:=true else huiwen:=false;
end;
{=============main=============}
begin
writeln;
for i:=1 to 999 do
if (huiwen(i)=true)and(huiwen(i*i)=true)and(huiwen(i*i*i)=true) then write(i:8);
end.
請編寫程序,以簡單算術表達式作為輸入,構造對應的無括號表達式(無括號表達式的運算符寫在運算對象的后面)。如:輸入:A*(B-C)+D,應輸出ABC-*D+;輸入:(A+B)/C-D*E,應輸出AB+C/DE*-。
鍵盤輸入一個只含加、減、乘、除四則運算和括號的數學表達式,編程求出該表達式的值并輸出結果。
一只公雞值5元,一只母雞值3元,3只小雞值1元,現用一百元要買一百只雞,問有什么方案?
(答案:(0、25、75),(4、18、78),(8、11、81),(12、4、84)) (★★)
program e;
var
i,j,k:integer;
begin
writeln;
for i:=1 to 20 do
for j:=1 to 33 do
begin
k:=100-i-j;
if (k mod 3=0)and(5*i+3*j+(k div 3)=100) then
writeln(i:8,j:8,k:8);
end;
end.
(來自其它試題)
某超市為了促銷,規定:購物不足50元的按原價付款,超過50不足100的超過部分按九折付款,超過100元的,超過部分按八折付款。編一程序完成超市的自動計費的工作。 (★)
program e;
var
n,money:real;
begin
writeln; writeln('input the money number:'); readln(n); money:=0;
if n<=50 then money:=n
else if (n>50)and(n<=100) then money:=50+(n-50)*0.9
else money:=50+(100-50)*0.9+(n-100)*0.8;
writeln('money=',money:0:2);
end.
輸入四個整數,排出名次后輸出這四個數。如輸入75、99、67、98。則輸出: (★★★)
75——3、99——1、67——4、98——2。
相關練習:任意輸入N個整數,排出名次后輸出這N個數。
program e;
var
a:array[1..4] of integer;
i,j,m:integer;
begin
writeln;
for i:=1 to 4 do read(a[i]);
for i:=1 to 4 do
begin
m:=1; write(a[i],'--');
for j:=1 to 4 do
if a[j]>a[i] then inc(m);
write(m,' ');
end;
end.
任意輸入一個正整數((測試數據:35829083; 答案:38)
program e;
var
n,s:longint;
begin
writeln; writeln('input n:'); readln(n);
s:=0;
while n>0 do
begin s:=s+(n mod 10); n:=n div 10; end;
writeln(s);
end.
1981年,李氏兄弟三人核對自己的年齡。老三說,第一,我們三兄弟之間年齡之差是相等的;第二,去年我們三兄弟的年齡數恰好都等于各自出生年份中各數之和的2倍。你能根據這兩點提示,編程計算出這兄弟三人的年齡和出生年月嗎? (★★)
(分析:假定這三兄弟均在1900年后出生)
(答案:1981年時,老大43歲1938年出生、老二37歲1944年出生、老三31歲1950年出生)
program e;
var
a,b,c:integer;
begin
writeln;
for a:=1 to 100 do
for b:=a+1 to 100 do
for c:=b+1 to 100 do
if (c-b=b-a) then
if((a-1)=2*(10+((1981-a)mod 10)+(((1981-a)div 10)mod 10))) then
if ((b-1)=2*(10+((1981-b)mod 10)+(((1981-b)div 10)mod 10))) then
if ((c-1)=2*(10+((1981-c)mod 10)+(((1981-c)div 10)mod 10))) then
writeln(a:4,b:4,c:4);
end.
將1~9這9個數字分成三組,每組3個數字,每個數字只能且必須使用一次,并且每組中的3個數字組成的三位數又要是完全平方數。請編程找出這樣的數。 (★★)
(分析:注意下面程序所采取的方法與前面類似問題的算法一樣,非常好。答案:361、529、784)
program e;
var
i,j,k,g,s,b,t,n:integer;
a:array[0..9] of integer;
begin
writeln;
for i:=11 to 31 do
for j:=i to 31 do
for k:=j to 31 do
begin
for n:=0 to 9 do a[n]:=0;
g:=i*i mod 10; s:=(i*i div 10) mod 10; b:=i*i div 100; a[g]:=1; a[s]:=1; a[b]:=1;
g:=j*j mod 10; s:=(j*j div 10) mod 10; b:=j*j div 100; a[g]:=1; a[s]:=1; a[b]:=1;
g:=k*k mod 10; s:=(k*k div 10) mod 10; b:=k*k div 100; a[g]:=1; a[s]:=1; a[b]:=1;
t:=0;
for n:=1 to 9 do t:=t+a[n];
if t=9 then writeln(i*i:8,j*j:8,k*k:8);
end;
end.
素數類問題程序設計試題
(備注:除第1題寫出判斷素數子函數外,其余各題的判斷素數子函數均相同,故省略,但同學們在編程的時候不能省,否則程序將無法運行。)
編程求正整數M與N(Mprogram e;
var
i,m,n:integer;
fun_ction prime(x:longint):boolean;
var
j,y:longint;
flag:boolean;
begin
y:=trunc(sqrt(x));
flag:=true;
for j:=2 to y do
if (x mod j = 0) then begin flag:=false; break; end;
if x<2 then flag:=false;
if flag=true then prime:=true else prime:=false;
end;
begin
writeln; writeln('input two integer number for m and n (m for i:=m to n do
if prime(i)=true then write(i:4);
end.
驗證歌德巴赫猜想:任何一個充分大的偶數N(N≥4),都可以用兩個素數之和表示。例如:4=2+2,6=3+3,8=3+5,98=17+79。 (★★,循環語句)
歌德巴赫猜想之一是任何大于5的奇數都可表示為3個素數之和。請用10個大于5的奇數驗證這一論斷。奇數用隨機函數產生,把驗證編寫為過程,打印出每個數和組成該數的三個素數。(★★)
編寫程序,判斷任何一個大于2的整數是素數還是合數。 (★★)
(素數算法:只需判斷到這個數開平方的整數為止即可,如判斷25,則只需判斷從2~5即可)
(測試數據:2147483647; 答案:Yes)(源程序略)
一個自然數是素數,且它的數字位置經過任意對換后仍為素數,則稱為絕對素數,例如13。試找出所有兩位數的絕對素數。 (★★)
(答案:11、13、17、31、37、71、73、79、97)(源程序略)
用篩選法求素數。 (★★★)
若兩素數之差為2,則稱該兩素數為雙胞胎數。求出[2,300]之內: (★★)
(1)最大的一對雙胞胎數;(2)有多少對雙胞胎數。
(答案:①281和283; ②19)(源程序略)
若兩個自然連續數乘積減1后是素數,則稱此兩個自然連續數為友數對,該素數稱為友素數。例如,由于2×3-1=5,因此,2與3是友數對,5是友素數。求[2,99]之間: (★★)
(1)友數對的數目;(2)所有友素數之和。
(答案:①48; ②128044)(源程序略)
梅森尼數是指能使2n-1為素數的數n。求[1,21]范圍內: (★★)
(1)有多少個梅森尼數?(2)最大的梅森尼數?
(答案:①7; ②19)
program e6_9;
var
i,count:longint;
begin
writeln; count:=0;
for i:=1 to 21 do
if prime(trunc(exp(i*ln(2))-1))=true then begin inc(count); write(i:8); end;
writeln; writeln('count=',count);
end.
一個素數(設為p)依次從低位去掉一位,二位,…,若所得的各數仍都是素數,則稱數p為超級素數。例如239即是超級素數。試求[100,9999]之內: (★★)
(1)超級素數的個數;(2)最大的超級素數。
(答案:①30; ②7393)
program e6_9;
var
i,count:integer;
begin
writeln;
for i:=100 to 999 do
if (prime(i))and(prime(i div 10))and(prime(i div 100)) then inc(count);
for i:=1000 to 9999 do
if (prime(i))and(prime(i div 10))and(prime(i div 100))and(prime(i div 1000)) then
begin inc(count); write(i:8); end;
writeln; writeln('count=',count);
end.
求1000~1200以內的所有純素數。純粹素數是這樣定義的:一個素數,去掉最高位,剩下的數仍為素數,再去掉剩下的數的最高位,余下的數還是素數。這樣下去一直到最后剩下的個位數也還是素數。(純素數不同于超級素數,注意二者的區別) (★★)
(答案:1013、1097、1103)
program I_14;
var
x:integer;
begin
writeln;
for x:=1000 to 1200 do
if prime(x)=true then
if prime(x mod 1000)=true then
if prime(x mod 100)=true then
if prime(x mod 10)=true then write(x:8);
end.
一個合數,去掉最低位,剩下的數仍是合數,再去掉剩下的數的最低位,余留下來的數還是合數,這樣反復,一直到最后公剩下的一位數仍是合數;我們把這樣的數稱為純粹合數。求100~500之間所有純粹合數的個數。 (★★)
(答案:58)
program I_18;
var
i,s:integer;
begin
writeln; s:=0;
for i:=100 to 500 do
if (prime(i)=false) and (prime(i div 10)=false) and (prime(i div 100)=false) and ((i div 100)<>1)
then begin write(i:8); inc(s); end;
writeln; writeln(s);
end.
試找出5個小于160而成等差數列的素數。 (★★)
(答案:5、11、17、23、29;或5、17、29、41、53)
program I_28;
var
i,d:integer;
begin
writeln;
for i:=2 to 160 do
for d:=1 to 26 do
if prime(i)=true then
if prime(i+d)=true then
if prime(i+2*d)=true then
if prime(i+3*d)=true then
if prime(i+4*d)=true then writeln(i:4,i+d:4,i+2*d:4,i+3*d:4,i+4*d:4)
end.
如果兩個素數之和的一半仍然是一個素數,則這三個素數可以組成一個等差素數組,如(3+7)/2=5,則(3,5,7)為一個等差素數組,編程求100以內的所有等差素數組。 (★★)
(答案:共46組)
program e6_9;
var
d,i:longint;
begin
writeln;
for i:=2 to 100 do
for d:=2 to 100 do
begin
if ((i+2*d)<100)and(prime(i)=true)and(prime(i+d)=true)and(prime(i+2*d)=true) then
write(i:8,i+d:8,i+2*d:8,'':16);
end;
end.
某自然數n的所有素數因子的平方和等于n,(n<100),請找出二個這樣的自然數n。 (★★)
(答案:4、9、25、49)
program e6_9;
var
i,j,s:integer;
begin
writeln;
for i:=2 to 100 do
begin
s:=0;
for j:=2 to i do
if (i mod j=0)and(prime(j)=true) then s:=s+j*j;
if s=i then write(i:8);
end;
end.
因子、質因子類問題程序設計試題
任意輸入一個正整數,輸出它的質因子乘積形式。如100=2×2×5×5。 (★★)
program e2_25;
var
i,n:integer;
begin
writeln; writeln('input a integer number:');
readln(n); write(n,'=');
while n>1 do
begin
for i:=2 to n do
if n mod i=0 then
begin
n:=n div i; write(i); dec(i);
if n>1 then write('*') else exit;
end;
end;
end.
求2~1000中的完數。(因子(除開它本身)之和等于它本身的數稱為完數,例如28的因子是1、2、4、7、14,并且1+2+4+7+14=28,所以28是完數。)(完數又稱完全數)(★★)
(答案:6、28、496)
program e2_27;
var
i,j,n,s:integer;
begin
writeln;
for i:=2 to 1000 do
begin
n:=i; s:=0;
for j:=1 to n div 2 do
if n mod j=0 then
s:=s+j;
if s=n then write(n:8);
end;
end.
整數36的質因子共有4個,它們是2,2,3,3,求整數716539的: (★★)
(1)質因子個數;(2)最小質因子;(3)最大質因子。
(答案:①3; ②83; ③97)
program e;
var
i,x,n:longint;
begin
writeln; n:=0; x:=716539; write(x,'=');
while (x>1) do
begin
for i:=2 to x do
if (x mod i=0) then
begin
write(i); x:=x div i; inc(n); dec(i);
if x>1 then write('*');
end;
end;
writeln; writeln('n=',n);
end.
若某整數N的所有因子之和等于N的倍數,則稱N為多因子完備數。例如,28是多因子完備數。因為:1+2+4+7+14+28=56=28×2。試求[1,700]之內: (★★)
(1)有多少個多因子完備數?(2)最大的一個多因子完備數是?
(答案:①6; ②672)
program e;
var
i,j,n,count:integer;
begin
writeln; count:=0;
for i:=1 to 700 do
begin
n:=0;
for j:=1 to i do
if (i mod j=0) then n:=n+j;
if (n mod i=0) then begin inc(count); write(i:8); end;
end;
writeln; writeln('count=',count);
end.
已知24有8個因子,而24正好被8整除。求[1,100]之間: (★★)
(1)有多少個整數能被其因子的個數整除?(2)其中最大的整數是?
(答案:①16; ②96)
program e;
var
i,j,n,count:integer;
begin
writeln; count:=0;
for i:=1 to 100 do
begin
n:=0;
for j:=1 to i do
if (i mod j=0) then inc(n);
if (i mod n=0) then begin write(i:8); inc(count); end;
end;
writeln; writeln('count=',count);
end.
尋求并輸出3000以內的親密數對。親密數對的定義為:若正整數A的所有因子(不包括A)之和為B,B的所有因子(不包括B)之和為A,且A≠B,則稱A與B為親密數對。 (★★)
(答案:[220,284]、[1184,1210]、[2620,2924])
program e;
var
i:integer;
fun_ction qinmi(n:integer):integer;
var
j,s:integer;
begin
s:=0;
for j:=1 to n-1 do if (n mod j=0) then s:=s+j;
qimi:=s;
end;
begin
writeln;
for i:=2 to 3000 do
if (qinmi(i)<3000)and(qinmi(qinmi(i))=i)and(i<>qinmi(i)) then
writeln(i:8,qinmi(i):8);
end.
一個自然數,若它的素因數至少是兩重的(相同的素因數至少個數為二個,如:36=2*2*3*3),則稱該數為"漂亮數"。若相鄰的兩個自然數都是"漂亮數",就稱它們為"孿生漂亮數",例如8和9就是一對"孿生漂亮數"。編程再找出一對"孿生漂亮數"。 (★★★)
(分析:素因素至少是兩重的則說明這個數至少能被素因素的平方整除,注意此程序退出語句用法)
(答案:288和289、675和676)
program e;
var
i:longint;
fun_ction piaoliang(x:longint):boolean;
var
a,y:longint;
flag:boolean;
begin
flag:=true; y:=x;
if y<4 then begin flag:=false; exit; end;
while y>1 do
begin
for a:=2 to y do
begin
if (y mod (a*a)<>0)and(a*a>y) then begin piaoliang:=false; exit; end
else if (y mod (a*a)=0) then
repeat
y:=y div a;
until (y mod a<>0);
if a>y then break;
end;
end;
if flag=true then piaoliang:=true else piaoliang:=false;
end;
begin
writeln; i:=8;
repeat
inc(i);
if (piaoliang(i)=true)and(piaoliang(i+1)=true) then
begin writeln(i:8,i+1:8); exit; end;
until(i>1000);
end.
6的因子有1、2、3、6,它們的和1+2+3+6與原數6的比值等于2,比6小的數的這個比值都小于2,比6大的數一直到12,才有(1+2+3+4+6+12)/12=2.33,比值超過2。 編程序,給出120以內最大比值的統計表,即從6開始計算此值,得到更大的此值就輸出,再得到新的更大比值則再輸出,一直到120,輸出格 式為: (★★)
6 12 。。。
2 2.33 。。。(其中比值精確到小數點后第二位)
(答案: 6 12 24 36 48 60 120
2.00 2.33 2.50 2.53 2.58 2.80 3.00 )
program e;
var
i,j,k,s:integer;
a:array[1..120] of integer;
b:array[1..120] of real;
begin
writeln; a[1]:=6; b[1]:=2; k:=1;
for i:=6 to 120 do
begin
s:=0;
for j:=1 to i do
if (i mod j=0) then s:=s+j;
if (s/i)>b[k] then begin inc(k); a[k]:=i; b[k]:=s/i; end;
end;
for i:=1 to k do write(a[i]:8);
writeln;
for i:=1 to k do write(b[i]:8:2);
end.
約瑟夫類問題程序設計試題
約瑟夫問題:N個人圍成一圈,從第一個人開始報數,數到M的人出圈;再由下一個人開始報數,數到M的人出圈;……,輸出依次出圈的人的編號。N、M由鍵盤輸入。(★★★)
(測試數據N=8,M=3; 答案:3、6、1、5、2、8、4、7)
program e;
var
m,n,i,count,x:integer;
a:array[1..1000] of integer;
begin
writeln; writeln('input integer number for n(people number):'); readln(n); x:=0;
writeln('input integer number for m:'); readln(m);
for i:=1 to n do a[i]:=1;
x:=0; count:=0; i:=0;
repeat
inc(i); if i=n+1 then i:=1;
if a[i]=1 then inc(count);
if count=m then begin count:=0; write(i,' '); a[i]:=0; inc(x); end;
until(x=n);
end.
n只猴子選大王,選舉辦法如下:從頭到尾1、2、3報數,凡報3的退出;余下的從尾到頭1、2、3報數,凡報3的退出;余下的又從頭到尾報數,還是報3的退出;依此類推,當剩下兩只猴子時,取這時報數報1的為王。若想當猴王,請問當初應占據什么位置?(★★★★)
(算法分析:開始選舉之前用n個數組存放數1,當報數為3的倍數時,更改存放的數為0(0表示淘汰出局),直到最后只有兩個1為止)
(測試數據:N=8; 答案:4)
program e4_7;
var
a:array[1..1000] of integer;
i,n,b,count:integer;
begin
writeln; write('input N:');
read(n);
for i:=1 to n do a[i]:=1;
count:=n;
while count>1 do
begin
if count=2 then
begin
for i:=1 to n do
if a[i]=1 then begin write(i); exit; end;
end
else
begin
b:=0;
for i:=1 to n do
begin
if a[i]=1 then inc(b);
if (b mod 3=0)and(b>0) then begin a[i]:=0; dec(count); b:=0; end;
end;
end;
if count=2 then
begin
for i:=n downto 1 do
if a[i]=1 then begin write(i); exit; end;
end
else
begin
b:=0;
for i:=n downto 1 do
begin
if a[i]=1 then inc(b);
if (b mod 3=0)and(b>0) then begin a[i]:=0; dec(count); b:=0; end;
end;
end;
end;
end.
圍繞著山頂有10個洞,一只狐貍和一只兔子住在各自的洞里。狐貍總想吃掉兔子。一天,兔子對狐貍說:“你想吃我有一個條件,先把洞從1~10編上號,你從10號洞出發,先到1號洞找我;第二次隔一個洞找我,第三次隔2個洞找我,以后依此類推,此數不限。若能找到我,你就可以飽餐一頓。不過在沒有找到我以前不能停下來。”狐貍滿口答應就開始找了,它從早到晚進了1000次洞,累得昏了過去也沒找到兔子。問兔子躲在幾號洞? (★★)
(答案:2、4、7、9)
program e4_8;
var
a:array[1..10] of integer;
i,n:longint;
begin
writeln;
for i:=1 to 10 do a[i]:=1;
n:=0;
for i:=1 to 1000 do
begin
n:=n+i;
if n mod 10=0 then a[10]:=0 else a[n mod 10]:=0;
end;
for i:=1 to 10 do
if a[i]=1 then write(i:8);
end.
有2N個學生去春游,其中男女各半。為了增加樂趣,他們玩一個出圈游戲,游戲的規則是:所有的學生圍成一個圈,順時針從1到2N編號,從1號開始以1到M(M≥1)循環報數,報到M的人退出,當有N-1個人出圈后,只剩下一個女生了,于是改變游戲規則從剛才的下一個人開始仍以1到M反向(與原來的方向相反)報數,報到M的人退出,恰好最后一個出圈的是女生。問當初他們是怎樣排列的,同時按他們出圈的先后順序輸出各自的編號。以“O”表示男生,“*”表示女生。
編號為1、2、3、…、N的N個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。從指定編號為1的人開始,按順時針方向自1開始順序報數,報到指定數M時停止報數,報M的人出列,并將他的密碼作為新的M值,從他在順時針方向的下一個人開始,重新從1報數,依此類推,直至所有的人全部出列為止。請設計一個程序求出出列的順序,其中N≤30,M及密碼值從鍵盤輸入。
高精度算法程序設計試題
(在下面的高精度算法程序設計試題中,均采用子過程進行輸入、輸出和加、減、乘等操作,其中的輸出和輸出操作通用,特別需仔細體會加、減、乘子過程的算法描述。)
從鍵盤輸入兩個位數不超過100位的正整數A和B,求A+B的值。
program e;
var
a,b,c:array[0..1000] of byte;
s1,s2:string;
procedure shuru;
var
i,j,code:integer;
flag:boolean;
begin
repeat
writeln('input A:'); readln(s1); flag:=true;
a[0]:=length(s1);
for i:=1 to a[0] do
if (ord(s1[i])<48)or(ord(s1[i])>57) then flag:=false;
until flag=true;
for i:=1 to a[0] do val(s1[a[0]-i+1],a[i],code);
repeat
writeln('input B:'); readln(s2); flag:=true;
b[0]:=length(s2);
for i:=1 to b[0] do
if (ord(s2[i])<48)or(ord(s2[i])>57) then flag:=false;
until flag=true;
for i:=1 to b[0] do val(s2[b[0]-i+1],b[i],code);
end;
procedure jia;
var
i,t:integer;
begin
if a[0]>b[0] then t:=a[0] else t:=b[0];
for i:=1 to t do
begin
c[i]:=c[i]+(a[i]+b[i]);
if c[i]>=10 then begin inc(c[i+1]); c[i]:=c[i] mod 10; end;
end
end;
procedure shuchu;
var
i:integer;
begin
while c[c[0]]=0 do dec(c[0]);
for i:=c[0] downto 1 do write(c[i]);
end;
{============main=========}
begin
writeln;
shuru;
jia;
shuchu;
end.
從鍵盤輸入兩個位數不超過100位的正整數A和B,求A-B的值。
program e;
var
a,b,c:array[0..1000] of byte;
s1,s2:string;
procedure shuru;
var
i,j,code:integer;
flag:boolean;
begin
repeat
writeln('input A:'); readln(s1); flag:=true;
a[0]:=length(s1);
for i:=1 to a[0] do
if (ord(s1[i])<48)or(ord(s1[i])>57) then flag:=false;
until flag=true;
for i:=1 to a[0] do val(s1[a[0]-i+1],a[i],code);
repeat
writeln('input B:'); readln(s2); flag:=true;
b[0]:=length(s2);
for i:=1 to b[0] do
if (ord(s2[i])<48)or(ord(s2[i])>57) then flag:=false;
until flag=true;
for i:=1 to b[0] do val(s2[b[0]-i+1],b[i],code);
end;
procedure jian;
var
i:integer;
begin
if (a[0]>b[0])or((a[0]=b[0])and(s1>s2)) then
for i:=1 to a[0] do
begin
if a[i]-b[i]<0 then begin a[i+1]:=a[i+1]-1; a[i]:=a[i]+10; end;
c[i]:=a[i]-b[i];
end
else
begin
write('-');
for i:=1 to b[0] do
begin
if b[i]-a[i]<0 then begin b[i+1]:=b[i+1]-1; b[i]:=b[i]+10; end;
c[i]:=b[i]-a[i];
end;
end;
end;
procedure shuchu;
var
i:integer;
begin
while c[c[0]]=0 do dec(c[0]);
for i:=c[0] downto 1 do write(c[i]);
end;
{============main=========}
begin
writeln;
shuru;
jian;
shuchu;
end.
從鍵盤輸入兩個位數不超過100位的正整數A和B,求A*B的值。
program e;
var
a,b,c:array[0..1000] of byte;
s1,s2:string;
procedure shuru;
var
i,j,code:integer;
flag:boolean;
begin
repeat
writeln('input A:'); readln(s1); flag:=true;
a[0]:=length(s1);
for i:=1 to a[0] do
if (ord(s1[i])<48)or(ord(s1[i])>57) then flag:=false;
until flag=true;
for i:=1 to a[0] do val(s1[a[0]-i+1],a[i],code);
repeat
writeln('input B:'); readln(s2); flag:=true;
b[0]:=length(s2);
for i:=1 to b[0] do
if (ord(s2[i])<48)or(ord(s2[i])>57) then flag:=false;
until flag=true;
for i:=1 to b[0] do val(s2[b[0]-i+1],b[i],code);
end;
procedure cheng;
var
i,j,k:integer;
begin
for i:=1 to a[0] do
for j:=1 to b[0] do
begin
c[i+j-1]:=c[i+j-1]+(a[i]*b[j] mod 10);
c[i+j]:=c[i+j]+(a[i]*b[j] div 10)+(c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
end;
procedure shuchu;
var
i:integer;
begin
while c[c[0]]=0 do dec(c[0]);
for i:=c[0] downto 1 do write(c[i]);
end;
{============main=========}
begin
writeln;
shuru;
cheng;
shuchu;
end.
輸入兩個正整數A和B,其中A、B都小于32767,求A/B的值。要求計算結果精確到小數點后N(1≤N≤200)位。(★★★)
(測試數據: ①輸入A=1,B=1997,N=25; 答案:0.0005007511266900350525788
②輸入A=19997,B=197,N=15; 答案:101.507614213197969)
program I_23;
var
a,b,c,n,i:integer;
begin
writeln; writeln('input A,B and N:'); readln(a,b,n);
write(a,'/',b,'='); write(a div b); write('.'); a:=a mod b;
for i:=1 to n do
begin c:=a*10 div b; a:=10*a mod b; write(c); end;
end.
設計一個程序,當鍵入一個正整數N(1≤N≤100)時,輸出N!的精確表示法。
(測試數據:25!=15511210043330985984000000;)
program e;
var
a,b,c:array[0..1000] of byte;
n,i,j,k:integer;
procedure cheng;
var
i,j,k:integer;
begin
for i:=1 to a[0] do
for j:=1 to b[0] do
begin
c[i+j-1]:=c[i+j-1]+(a[i]*b[j] mod 10);
c[i+j]:=c[i+j]+(a[i]*b[j] div 10)+(c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
end;
procedure shuchu;
var
i:integer;
begin
while c[c[0]]=0 do dec(c[0]);
for i:=c[0] downto 1 do write(c[i]);
end;
{============main=========}
begin
writeln; writeln('input n(<=100):'); readln(n); c[1]:=1;
for i:=1 to n do
begin
j:=1000;
while c[j]=0 do dec(j);
a[0]:=j;
for k:=j downto 1 do begin a[k]:=c[k]; c[k]:=0; end;
b[1]:=i mod 10; b[2]:=(i div 10) mod 10; b[3]:=(i div 100) mod 10;
b[0]:=3;
cheng;
end;
write(n,'!='); shuchu;
end.
編程計算Xn,其中X、n的值由鍵盤輸入(必須為正整數并且X<50、n<10)。
(測試數據:X=49,n=9; 答案:1628413597910449)
program e;
var
a,b,c:array[0..1000] of byte;
x,n,i,j,k:integer;
procedure cheng;
var
i,j,k:integer;
begin
for i:=1 to a[0] do
for j:=1 to b[0] do
begin
c[i+j-1]:=c[i+j-1]+(a[i]*b[j] mod 10);
c[i+j]:=c[i+j]+(a[i]*b[j] div 10)+(c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
end;
procedure shuchu;
var
i:integer;
begin
while c[c[0]]=0 do dec(c[0]);
for i:=c[0] downto 1 do write(c[i]);
end;
{============main=========}
begin
writeln; writeln('input x(<50) and n(<10):'); readln(x,n); c[1]:=1;
for i:=1 to n do
begin
j:=1000;
while c[j]=0 do dec(j);
a[0]:=j;
for k:=j downto 1 do begin a[k]:=c[k]; c[k]:=0; end;
b[1]:=x mod 10; b[2]:=(x div 10) mod 10; b[3]:=(x div 100) mod 10;
b[0]:=3;
cheng;
end;
write(x,'︿',n,'='); shuchu;
end.
求789789…789(共29組789)除以79的商和余數。
(答案:余數8 商:999733911126316189607328847835176949100重復一次9997339)
program e;
const w=3*29; m=79;
var
a,b:array[0..w] of integer;
x,i,j:integer;
begin
writeln;

展開更多......

收起↑

資源預覽

    <pre id="tfb94"><li id="tfb94"></li></pre>

      <bdo id="tfb94"><rt id="tfb94"></rt></bdo>
    • <menu id="tfb94"><dl id="tfb94"></dl></menu><i id="tfb94"><acronym id="tfb94"><sub id="tfb94"></sub></acronym></i>

      1. 主站蜘蛛池模板: 旅游| 临沭县| 团风县| 丹东市| 阳谷县| 綦江县| 平乡县| 镇巴县| 绥阳县| 分宜县| 察哈| 清苑县| 柏乡县| 罗平县| 呼伦贝尔市| 施秉县| 历史| 休宁县| 虞城县| 白玉县| 绥中县| 汝南县| 遂川县| 运城市| 舟曲县| 西贡区| 河津市| 汉沽区| 营山县| 正安县| 法库县| 尼勒克县| 共和县| 罗源县| 台南县| 邹城市| 涪陵区| 临夏县| 阳东县| 汉寿县| 沅江市|