1. PASCAL演算法知識題~~高分~緊急~
6.1 窮舉策略的概念
所謂枚舉法,指的是從可能的解的集合中一一枚舉各元素, 用題目給定的檢驗條件判定哪些是無用的,哪些是有用的。能使命題成立,即為其解。
有些問題可以用循環語句和條件語句直接求解,有些問題用循環求解時循環次數太多,無法編寫程序,怎麼辦?下面是用「千軍萬馬過獨木橋,適者存」的方式實現窮舉策略的。
6.2 典型例題與習題
例1.將2n個0和2n個1,排成一圈。從任一個位置開始,每次按逆時針的方向以長度為n+1的單位進行數二進制數。要求給出一種排法,用上面的方法產生出來的2n+1個二進制數都不相同。
例如,當n=2時,即22個0和22個1排成如下一圈:
比如,從A位置開始,逆時針方向取三個數000,然後再從B位置上開始取三個數001,接著從C開始取三個數010,...可以得到000,001,010,101,011,111,110,100共8個二進制數且都不相同。
程序說明:
以n=4為例,即有16個0,16個1,數組a用以記錄32個0,1的排法,數組b統計二進制數出現的可能性。
程序清單
PROGRAM NOI00;
VAR
A :ARRAY[1..36] OF 0..1
B :ARRAY[0..31] OF INTEGER;
I,J,K,S,P:INTEGER;
BEGIN
FOR I:=1 TO 36 DO A[I]:=0;
FOR I:=28 TO 32 DO A[I]:=1;
P:=1; A[6]:=1;
WHILE (P=1) DO
BEGIN
J:=27
WHILE A[J]=1 DO J:=J-1;
( A[J]:=1 )
FOR I:=J+1 TO 27 DO ( A[i]:=0 )
FOR I:=0 TO 31 DO B[I]:=0;
FOR I:=1 TO 32 DO
BEGIN
( S:=0)
FOR K:=I TO I+4 DO S:=S*2+A[k];
( B[S]:=1 )
END;
S:=0;
FOR I:=0 TO 31 DO S:=S+B[I];
IF ( S=32 ) THEN P:=0
END;
FOR I:=1 TO 32 DO FOR J:=I TO I+4 DO WRITE(A[J]);
WRITELN
END.
例2:在A、B兩個城市之間設有N個路站(如下圖中的S1,且N<100),城市與路站之間、路站和路站之間各有若干條路段(各路段數<=20,且每條路段上的距離均為一個整數)。
A,B的一條通路是指:從A出發,可經過任一路段到達S1,再從S1出發經過任一路段,…最後到達B。通路上路段距離之和稱為通路距離(最大距離<=1000)。當所有的路段距離給出之後,求出所有不同距離的通路個數(相同距離僅記一次)。
例如:下圖所示是當N=1時的情況:
從A到B的通路條數為6,但因其中通路5+5=4+6,所以滿足條件的不同距離的通路條數為5。
演算法說明:本題採用窮舉演算法。
數據結構:N:記錄A,B間路站的個數
數組D[I,0]記錄第I-1個到第I路站間路段的個數
D[I,1],D[I,2],…記錄每個路段距離
數組G記錄可取到的距離
程序清單:
program CHU7_6;
var i,j,n,s:integer;
b:array[0..100] of integer;
d:array[0..100,0..20] of integer;
g:array[0..1000] of 0..1;
begin
readln(n);
for i:=1 to n+1 do
begin
readln(d[i,0]);
for j:=1 to d[i,0] do read(d[i,j]);
end;
d[0,0]:=1;
for i:=1 to n+1 do b[i]:=1;
b[0]:=0;
for i:=1 to 1000 do g[i]:=0;
while b[0]<>1 do
begin
s:=0;
for i:=1 to n+1 do
s:= s+d[i,b[i]];
g[s]:=1;j:=n+1;
while b[j]=d[j,0] do j:=j-1;
b[j]:=b[j]+1;
for i:=j+1 to n+1 do b[i]:=1;
end;
s:=0;
for i:=1 to 1000 do
s:=s+g[i];
writeln(s);readln;
end.
2.1 遞歸的概念
1.概念
一個過程(或函數)直接或間接調用自己本身,這種過程(或函數)叫遞歸過程(或函數).
如:
procere a;
begin
.
.
.
a;
.
.
.
end;
這種方式是直接調用.
又如:
procere b; procere c;
begin begin
. .
. .
. .
c; b;
. .
. .
. .
end; end;
這種方式是間接調用.
例1計算n!可用遞歸公式如下:
1 當 n=0 時
fac(n)={n*fac(n-1) 當n>0時
可編寫程序如下:
program fac2;
var
n:integer;
function fac(n:integer):real;
begin
if n=0 then fac:=1 else fac:=n*fac(n-1)
end;
begin
write('n=');readln(n);
writeln('fac(',n,')=',fac(n):6:0);
end.
例2 樓梯有n階台階,上樓可以一步上1階,也可以一步上2階,編一程序計算共有多少種不同的走法.
設n階台階的走法數為f(n)
顯然有
1 n=1
f(n)={2 n=2
f(n-1)+f(n-2) n>2
可編程序如下:
program louti;
var n:integer;
function f(x:integer):integer;
begin
if x=1 then f:=1 else
if x=2 then f:=2 else f:=f(x-1)+f(x-2);
end;
begin
write('n=');read(n);
writeln('f(',n,')=',f(n))
end.
2.2 如何設計遞歸演算法
1.確定遞歸公式
2.確定邊界(終了)條件
練習:
用遞歸的方法完成下列問題
1.求數組中的最大數
2.1+2+3+...+n
3.求n個整數的積
4.求n個整數的平均值
5.求n個自然數的最大公約數與最小公倍數
6.有一對雌雄兔,每兩個月就繁殖雌雄各一對兔子.問n個月後共有多少對兔子?
7.已知:數列1,1,2,4,7,13,24,44,...求數列的第 n項.
2.3典型例題
例3 梵塔問題
如圖:已知有三根針分別用1,2,3表示,在一號針中從小放n個盤子,現要求把所有的盤子
從1針全部移到3針,移動規則是:使用2針作為過度針,每次只移動一塊盤子,且每根針上
不能出現大盤壓小盤.找出移動次數最小的方案.
程序如下:
program fanta;
var
n:integer;
procere move(n,a,b,c:integer);
begin
if n=1 then writeln(a,'--->',c)
else begin
move(n-1,a,c,b);
writeln(a,'--->',c);
move(n-1,b,a,c);
end;
end;
begin
write('Enter n=');
read(n);
move(n,1,2,3);
end.
例4 快速排序
快速排序的思想是:先從數據序列中選一個元素,並將序列中所有比該元素小的元素都放到它的右邊或左邊,再對左右兩邊分別用同樣的方法處之直到每一個待處理的序列的長度為1, 處理結束.
程序如下:
program kspv;
const n=7;
type
arr=array[1..n] of integer;
var
a:arr;
i:integer;
procere quicksort(var b:arr; s,t:integer);
var i,j,x,t1:integer;
begin
i:=s;j:=t;x:=b[i];
repeat
while (b[j]>=x) and (j>i) do j:=j-1;
if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end;
while (b[i]<=x) and (i<j) do i:=i+1;
if i<j then begin t1:=b[j];b[j]:=b[i];b[i]:=t1; end
until i=j;
b[i]:=x;
i:=i+1;j:=j-1;
if s<j then quicksort(b,s,j);
if i<t then quicksort(b,i,t);
end;
begin
write('input data:');
for i:=1 to n do read(a[i]);
writeln;
quicksort(a,1,n);
write('output data:');
for i:=1 to n do write(a[i]:6);
writeln;
end.
3.1 回溯的設計
1.用棧保存好前進中的某些狀態.
2.制定好約束條件
例1由鍵盤上輸入任意n個符號;輸出它的全排列.
program hh;
const n=4;
var i,k:integer;
x:array[1..n] of integer;
st:string[n];
t:string[n];
procere input;
var i:integer;
begin
write('Enter string=');readln(st);
t:=st;
end;
function place(k:integer):boolean;
var i:integer;
begin
place:=true;
for i:=1 to k-1 do
if x[i]=x[k] then
begin place:=false; break end ;
end;
procere print;
var i:integer;
begin
for i:=1 to n do write(t[x[i]]);
writeln;
end;
begin
input;
k:=1;x[k]:=0;
while k>0 do
begin
x[k]:=x[k]+1;
while (x[k]<=n) and (not place(k)) do x[k]:=x[k]+1;
if x[k]>n then k:=k-1
else if k=n then print
else begin k:=k+1;x[k]:=0 end
end ;
end.
例2.n個皇後問題:
program hh;
const n=8;
var i,j,k:integer;
x:array[1..n] of integer;
function place(k:integer):boolean;
var i:integer;
begin
place:=true;
for i:=1 to k-1 do
if (x[i]=x[k]) or (abs(x[i]-x[k])=abs(i-k)) then
place:=false ;
end;
procere print;
var i:integer;
begin
for i:=1 to n do write(x[i]:4);
writeln;
end;
begin
k:=1;x[k]:=0;
while k>0 do
begin
x[k]:=x[k]+1;
while (x[k]<=n) and (not place(k)) do x[k]:=x[k]+1;
if x[k]>n then k:=k-1
else if k=n then print
else begin k:=k+1;x[k]:=0 end
end ;
end.
回溯演算法的公式如下:
3.2 回溯演算法的遞歸實現
由於回溯演算法用一棧數組實現的,用到棧一般可用遞歸實現。
上述例1的遞歸方法實現如下:
program hh;
const n=4;
var i,k:integer;
x:array[1..n] of integer;
st:string[n];
t:string[n];
procere input;
var i:integer;
begin
write('Enter string=');readln(st);
t:=st;
end;
function place(k:integer):boolean;
var i:integer;
begin
place:=true;
for i:=1 to k-1 do
if x[i]=x[k] then
begin place:=false; break end ;
end;
procere print;
var i:integer;
begin
for i:=1 to n do write(t[x[i]]);
writeln;readln;
end;
procere try(k:integer);
var i :integer;
begin
if k=n+1 then begin print;exit end;
for i:=1 to n do
begin
x[k]:=i;
if place(k) then try(k+1)
end
end;
begin
input;
try(1);
end.
例2:n皇後問題的遞歸演算法如下:
程序1:
program hh;
const n=8;
var i,j,k:integer;
x:array[1..n] of integer;
function place(k:integer):boolean;
var i:integer;
begin
place:=true;
for i:=1 to k-1 do
if (x[i]=x[k]) or (abs(x[i]-x[k])=abs(i-k)) then
place:=false ;
end;
procere print;
var i:integer;
begin
for i:=1 to n do write(x[i]:4);
writeln;
end;
procere try(k:integer);
var i:integer;
begin
if k=n+1 then begin print; exit end;
for i:= 1 to n do
begin
x[k]:=i;
if place(k) then try(k+1);
end;
end ;
begin
try(1);
end.
程序2:
說明:當n=8 時有30條對角線分別用了l和r數組控制,
用c數組控制列.當(i,j)點放好皇後後相應的對角線和列都為false.遞歸程序如下:
program nhh;
const n=8;
var s,i:integer;
a:array[1..n] of byte;
c:array[1..n] of boolean;
l:array[1-n..n-1] of boolean;
r:array[2..2*n] of boolean;
procere output;
var i:integer;
begin
for i:=1 to n do write(a[i]:4);
inc(s);writeln(' total=',s);
end;
procere try(i:integer);
var j:integer;
begin
for j:=1 to n do
begin
if c[j] and l[i-j] and r[i+j] then
begin
a[i]:=j;c[j]:=false;l[i-j]:=false; r[i+j]:=false;
if i<n then try(i+1) else output;
c[j]:=true;l[i-j]:=true;r[i+j]:=true;
end;
end;
end;
begin
for i:=1 to n do c[i]:=true;
for i:=1-n to n-1 do l[i]:=true;
for i:=2 to 2*n do r[i]:=true;
s:=0;try(1);
writeln;
end.
7.1 貪心策略的定義
貪心策略是:指從問題的初始狀態出發,通過若干次的貪心選擇而得出最優值(或較優解)的一種解題方法。
其實,從「貪心策略」一詞我們便可以看出,貪心策略總是做出在當前看來是最優的選擇,也就是說貪心策略並不是從整體上加以考慮,它所做出的選擇只是在某種意義上的局部最優解,而許多問題自身的特性決定了該題運用貪心策略可以得到最優解或較優解。
例1:在n行m列的正整數矩陣中,要求從每一行中選一個數,使得選出的n個數的和最大。
本題可用貪心策略:選n次,每一次選相應行中的最大值即可。
例2:在一個N×M的方格陣中,每一格子賦予一個數(即為權)。規定每次移動時只能向上或向右。現試找出一條路徑,使其從左下角至右上角所經過的權之和最大。
本題用貪心策略不能得到最優解,我們以2×4的矩陣為例。 3 4 6
1 2 10
若按貪心策略求解,所得路徑為:1,3,4,6;
若按動態規劃法求解,所得路徑為:1,2,10,6。
例3:設定有n台處理機p1,p2,......pn,和m個作業j1,j2,...jm,處理機可並行工作,作業未完成不能中斷,作業ji在處理機上的處理時間為ti,求解最佳方案,使得完成m項工作的時間最短?
本題不能用貪心演算法求解:理由是若n=3,m=6 各作業的時間分別是11 7 5 5 4 7
用貪心策略解(每次將作業加到最先空閑的機器上)time=15,用搜索策略最優時間應是14,但是貪心策略給我們提供了一個線索那就是每台處理上的時間不超過15,給搜索提供了方便。
總之:
1. 不能保證求得的最後解是最佳的;
2. 只能用來求某些最大或最小解問題;
3. 能確定某些問題的可行解的范圍,特別是給搜索演算法提供了依據。
7. 2 貪心策略的特點
貪心演算法有什麼樣的特點呢?我認為,適用於貪心演算法解決的問題應具有以下2個特點:
1、貪心選擇性質:
所謂貪心選擇性質是指應用同一規則f,將原問題變為一個相似的、但規模更小的子問題、而後的每一步都是當前看似最佳的選擇。這種選擇依賴於已做出的選擇,但不依賴於未做出的選擇。從全局來看,運用貪心策略解決的問題在程序的運行過程中無回溯過程。關於貪心選擇性質,讀者可在後文給出的貪心策略狀態空間圖中得到深刻地體會。
2、局部最優解:
我們通過特點2向大家介紹了貪心策略的數學描述。由於運用貪心策略解題在每一次都取得了最優解,但能夠保證局部最優解得不一定是貪心演算法。如大家所熟悉得動態規劃演算法就可以滿足局部最優解,但貪心策略比動態規劃時間效率更高站用內存更少,編寫程序更簡單。
7.3 典型例題與習題
例4:背包問題:
有一個背包,背包容量是M=150。有7個物品,物品可以分割成任意大小。
要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。 物品
A
B
C
D
E
F
G
重量
35
30
60
50
40
10
25
價值
10
40
30
50
35
40
30
分析:
目標函數: ∑pi最大
約束條件是裝入的物品總重量不超過背包容量:∑wi<=M( M=150)
(1)根據貪心的策略,每次挑選價值最大的物品裝入背包,得到的結果是否最優?
(2)每次挑選所佔空間最小的物品裝入是否能得到最優解?
(3)每次選取單位容量價值最大的物品,成為解本題的策略。
程序如下:
program beibao;
const
m=150;
n=7;
var
xu:integer;
i,j:integer;
goods:array[1..n,0..2] of integer;
ok:array[1..n,1..2] of real;
procere init;
var
i:integer;
begin
xu:=m;
for i:=1 to n do
begin
write('Enter the price and weight of the ',i,'th goods:');
goods[i,0]:=i;
read(goods[i,1],goods[i,2]);
readln;
ok[i,1]:=0; ok[i,2]:=0;
end;
end;
procere make;
var
bi:array[1..n] of real;
i,j:integer;
temp1,temp2,temp0:integer;
begin
for i:=1 to n do
bi[i]:=goods[i,1]/goods[i,2];
for i:=1 to n-1 do
for j:=i+1 to n do
begin
if bi[i]<bi[j] then begin
temp0:=goods[i,0]; temp1:=goods[i,1]; temp2:=goods[i,2];
goods[i,0]:=goods[j,0]; goods[i,1]:=goods[j,1]; goods[i,2]:=goods[j,2];
goods[j,0]:=temp0; goods[j,1]:=temp1; goods[j,2]:=temp2;
end;
end;
end;
begin
init;
make;
for i:=1 to 7 do
begin
if goods[i,2]>xu then break;
ok[i,1]:=goods[i,0]; ok[i,2]:=1;
xu:=xu-goods[i,2];
end;
j:=i;
if i<=n then
begin
ok[i,1]:=goods[i,0];
ok[i,2]:=xu/goods[i,2];
end;
for i:=1 to j do
writeln(ok[i,1]:1:0,':',ok[i,2]*goods[i,2]:2:1);
end.
例5:旅行家的預算問題:
一個旅行家想駕駛汽車以最少的費用從一個城市到另一個城市,給定兩個城市間的距離d1,汽車油箱的容量是c,每升汽油能行駛的距離d2,出發時每升汽油的價格是p,沿途加油站數為n(可為0),油站i離出發點的距離是di,每升汽油的價格是pi。
計算結果四捨五入保留小數點後兩位,若無法到達目的地輸出「No answer"
若輸入:
d1=275.6 c=11.9 d2=27.4 p=8 n=2
d[1]=102 p[1]=2.9
d[2]=220 p[2]=2.2
output
26.95
本問題的貪心策略是:找下一個較便宜的油站,根據距離確定加滿、不加、加到剛好到該站。
程序如下:
program jiayou;
const maxn=10001;
zero=1e-16;
type
jd=record
value,way,over:real;
end;
var oil:array[1..maxn] of ^jd;
n:integer;
d1,c,d2,cost,maxway:real;
function init:boolean;
var i:integer;
begin
new(oil[1]);
oil[1]^.way:=0;
read(d1,c,d2,oil[1]^.value,n);
maxway:=d2*c;
for i:=2 to n+1 do
begin
new(oil[i]);
readln(oil[i]^.way,oil[i]^.value);
oil[i]^.over:=0;
end;
inc(n,2);
new(oil[n]);
oil[n]^.way:=d1;
oil[n]^.value:=0;
oil[n]^.over:=0;
for i:=2 to n do
if oil[i]^.way-oil[i-1]^.way>maxway then
begin
init:=false;
exit
end;
init:=true;
end;
procere buy(i:integer;miles:real);
begin
cost:=cost+miles/d2*oil[i]^.value;
end;
procere solve;
var i,j:integer;
s:real;
begin
i:=1;j:=i+1;
repeat
s:=0.0;
while( s<=maxway+zero) and (j<=n-1) and (oil[i]^.value<=oil[j]^.value) do
begin
inc(j);
s:=s+oil[j]^.way-oil[j-1]^.way
end;
if s<=maxway+zero then
if (oil[i]^.over+zero>=oil[j]^.way-oil[i]^.way) then
oil[j]^.over:=oil[i]^.over-(oil[j]^.way-oil[i]^.way) else
begin
buy(i,oil[j]^.way-oil[i]^.way-oil[i]^.over);
oil[j]^.over:=0.0;
end
else begin
buy(i,maxway-oil[i]^.over);
j:=i+1;
oil[j]^.over:=maxway-(oil[j]^.way-oil[i]^.way);
end;
i:=j;
until i=n;
end;
begin
cost:=0;
if init then begin
solve;
writeln(cost:0:2);
end else writeln('No answer');
end.
例6:n個部件,每個部件必須經過先A後B兩道工序。
以知部件i在A,B 機器上的時間分別為ai,bi。如何安排加工順序,總加工時間最短?
輸入:
5 部件 1 2 3 4 5
ai 3 5 8 7 10
bi 6 2 1 4 9
輸出:
34
1 5 4 2 3
本問題的貪心策略是A機器上加工短的應優先,B機器上加工短的應靠後。
程序如下:
program workorder;
const maxn=100;
type jd=record
a,b,m,o:integer;
end;
var n,min,i:integer;
c:array[1..maxn] of jd;
order:array[1..maxn] of integer;
procere init;
var i:integer;
begin
readln(n);
for i:=1 to n do
read(c[i].a);
readln;
for i:=1 to n do
read(c[i].b);
readln;
for i:=1 to n do
begin
if c[i].a<c[i].b then c[i].m:=c[i].a else c[i].m:=c[i].b;
c[i].o:=i;
end;
end;
procere sort;
var i,j,k,t:integer;
temp:jd;
begin
for i:=1 to n-1 do
begin
k:=i;t:=c[i].m;
for j:=i+1 to n do
if c[j].m<t then begin t:=c[j].m;k:=j end ;
if k<>i then begin temp:=c[i];c[i]:=c[k];c[k]:=temp end
end;
end;
procere playorder;
var i,s,t:integer;
begin
fillchar(order,sizeof(order),0);
s:=1;
t:=n;
for i:=1 to n do
if c[i].m=c[i].a then begin order[s]:=i;s:=s+1 end
else begin order[t]:=i;t:=t-1;end;
end;
procere calc_t;
var i,t1,t2:integer;
begin
t1:=0;t2:=0;
for i:=1 to n do
begin
t1:=t1+c[order[i]].a;
if t2<t1 then t2:=t1;
t2:=t2+c[order[i]].b;
end;
min:=t2;
end;
begin
init;
sort;
playorder;
calc_t;
writeln(min);
for i:=1 to n do
write(c[order[i]].o,' ');
writeln;
end.
2. 在演算法中如何識別迴文的數字
# include <stdio.h>
int hwc(long a)
{ int i=0,b,c[10];
while(a)
{c[i]=a%10;
a=a/10;
i++;
}
c[i]='\0';
b=i;
for(i=0;i<b/2+1;i++)
if(c[i]!=c[b-1])
{return 0;
break;
}
else
return 1;
}
main()
{long a,b;
printf("please input_ ");
scanf("%ld",&a);
b=hwc(a);
if(b)
printf("yes");
else
printf("no");
getch();
}
判斷一個數是否為迴文結構
3. 設計一個演算法,判斷一個正的n(n>2)位數是不是迴文數
演算法語言:C++語言 #include <iostream>#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
void Numtostring(int num,char s[]) //自定義數字轉換成字元串函數
{
int temp,i=0;
// char *s;
// s=(char *)malloc(500);
//char s[500];
while(num!=0)
{
temp=num%10;
s[i]=temp+48;
i++;
num=num/10;
}
s[i]='\0';
strrev(s);
}
int NumberTest0(int num) //數字逆序,返回逆序值
{
int temp;
int n,i;
int num0=0;
n=log10(num);
printf("n=%d\n",n);
for(i=n;i>=0;i--)
{
temp=num%10;
num=num/10;
num0+=temp*pow(10,i);
printf("num0=%d\n",num0);
}
return num0;
}
int StringTest(int num)//迴文判斷,字元串逆轉思路
{
char s[500],s1[500];
Numtostring(num,s);//數字轉換成字元串函數
puts(s);
strcpy(s1,s);
strrev(s1);
if(strcmp(s1,s)==0)
printf("Yes\n");
else
printf("No\n");
return 0;
}
int NumberTest1(int n)//迴文判斷 老師解題思路 聽說是大神級的人物寫的。。。
{
int temp=0;
int m=n;
while(n)
{
temp=temp*10;
temp+=n%10;
n=n/10;
}
printf("%d\n",temp);
if(temp==m)
printf("Yes\n");
else
printf("No\n");
return 0;
}
int main()
{
int num,num0;
// long n;
char s[500];
while(scanf("%d",&num)!=EOF)
{
/**//*num0=Test(num);
printf("%d\n",num0);
if(num0==num)
printf("Yes\n");
else
printf("No\n");*/
// Numtostring(num,s);
// puts(s);
// StringTest(num);
NumberTest1(num);
}
return 0;
}
【廣州大學華軟軟體學院】為您服務
4. 設計一個演算法,輸出所有3位數的迴文數(如101、323、919等),並畫出演算法框圖…求高手!
1) 令b=0
2) 令b增加1
3) 如果b=10,則結束演算法
4) 令a=0
5) 輸出(b*100+a*10+b)
6) 令a增加1
7) 如果a=10,則回到2),否則回到5)
自己把它轉化成框圖吧.
5. 求一個演算法:通過兩個數字返回一個1-6之間的固定數字
其實這個數得百位不需要考慮!因為整百得數都能夠被4整除!!!
現在可以看成是一個兩位數得十位數與個位的數字互換,得到一個新的2位數,,新,舊兩個2位數都能被4整除!!!
這樣的數有 84和48是一組 ;40和04是一組;80和08是一組; 兩個相同得數算不算算,(如00 44 88);就只有這么多了,至於百位數可以是1 2 3 4 5 6 7 8 9重得任意一個!
百位是1到8的任意數都行,只要看十位與個位就行了
十位與個位必須都在是偶數
符合要求的數為X44,X48,X06,X08,X00,X88,
6. 迴文數的迴文數演算法
隨意找一個十進制的數,把它倒過來成另一個數,再把這兩個數相加,得一個和數,這是第一步;然後把這個和數倒過來,與原來的和數相加,又得到一個新的和數,這是第二步。照此方法,一步步接續往下算,直到出現一個「迴文數」為n。例如:28+82=110,110+011=121,兩步就得出了一個「迴文數」。如果接著算下去,還會得到更多的「迴文數」。這個過程稱為「196演算法」。
7. 24點問題,回溯演算法
回溯演算法也叫試探法,它是一種系統地搜索問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。用回溯演算法解決問題的一般步驟為: 1、定義一個解空間,它包含問題的解。 2、利用適於搜索的方法組織解空間。 3、利用深度優先法搜索解空間。 4、利用限界函數避免移動到不可能產生解的子空間。 問題的解空間通常是在搜索問題的解的過程中動態產生的,這是回溯演算法的一個重要特性。1.跳棋問題:33個方格頂點擺放著32枚棋子,僅中央的頂點空著未擺放棋子。下棋的規則是任一棋子可以沿水平或成垂直方向跳過與其相鄰的棋子,進入空著的頂點並吃掉被跳過的棋子。試設計一個演算法找出一種下棋方法,使得最終棋盤上只剩下一個棋子在棋盤中央。演算法實現提示利用回溯演算法,每次找到一個可以走的棋子走動,並吃掉。若走到無子可走還是剩餘多顆,則回溯,走下一顆可以走動的棋子。當吃掉31顆時說明只剩一顆,程序結束。2.中國象棋馬行線問題:中國象棋半張棋盤如圖1(a)所示。馬自左下角往右上角跳。今規定只許往右跳,不許往左跳。比如圖4(a)中所示為一種跳行路線,並將所經路線列印出來。列印格式為:0,0->2,1->3,3->1,4->3,5->2,7->4,8…演算法分析:如圖1(b),馬最多有四個方向,若原來的橫坐標為j、縱坐標為i,則四個方向的移動可表示為:1: (i,j)→(i+2,j+1); (i<3,j<8) 2: (i,j)→(i+1,j+2); (i<4,j<7)3: (i,j)→(i-1,j+2); (i>0,j<7) 4: (i,j)→(i-2,j+1); (i>1,j<8)搜索策略:S1:A[1]:=(0,0);S2:從A[1]出發,按移動規則依次選定某個方向,如果達到的是(4,8)則轉向S3,否則繼續搜索下一個到達的頂點;S3:列印路徑。演算法設計:procere try(i:integer); var j:integer;beginfor j:=1 to 4 do if 新坐標滿足條件 thenbegin記錄新坐標;if 到達目的地 then print else try(i+1); 退回到上一個坐標,即回溯;end;end;
8. 什麼是迴文數演算法
迴文數演算法 c語言和java語言實現迴文數演算法的區別
問題:
將所有迴文數從小到大排列,求第N個迴文數。
一個正數如果順著和反過來都是一樣的(如13431,反過來也是...
9. 設計一個判斷正整數是一個迴文數的演算法.所謂迴文數是指左右數字完全對稱的自然數.例如,121,12321,484,555.
在窗體上畫一個textbox控制項和一個commandbutton控制項
輸入以下代碼:
Private Sub Command1_Click()
If Text1.Text = StrReverse(Text1.Text) Then
Print Text1.Text & " 是迴文數"
Else
Print Text1.Text & " 不是迴文數"
End If
End Sub
10. 迴文數字有什麼特點迴文數字是什麼得到的
特點:「迴文」是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字游戲,如「我為人人,人人為我」等。在數學中也有這樣一類數字有這樣的特徵,成為迴文數(palindrome number)。
演算法:隨意找一個十進制的數,把它倒過來成另一個數,再把這兩個數相加,得一個和數,這是第一步;然後把這個和數倒過來,與原來的和數相加,又得到一個新的和數,這是第二步。照此方法,一步步接續往下算,直到出現一個「迴文數」為n。例如:28+82=110,110+011=121,兩步就得出了一個「迴文數」。如果接著算下去,還會得到更多的「迴文數」。這個過程稱為「196演算法」。