一道演算法題的求解

2021-10-09 15:06:03 字數 2791 閱讀 5948

將1-9這9個數字組合成3個三位數,要求第2個三位數是第乙個三位數的2倍,第3個三位數是第乙個三位數的3倍。找出所有的可能方案。

如果直接求出所有符合要求的排列組合的數那效率會特別低,所以最基本的思路就是先用便捷的方法得到滿足一部分要求的數,再篩選。

組合的三位數的範圍是111-999(重複的、含0的最後排除)

那麼第乙個數的範圍就是111-333

遍歷111-333,求出三個數字的每一位數字

排除掉含重複陣列和含數字0的方案

程式:

%

% method1: 遍曆法

for i=

123:

333% 第乙個數的範圍

check

(i);

end

function check

( data1 )

%check 此處顯示有關此函式的摘要

% 此處顯示詳細說明

a=zeros(1

,9);

% 提取9個資料

% 第乙個數字ia(

1)=mod

(data1,10)

;% 取餘數,個位a(

2)=mod

(floor

(data1/10)

,10);

% 十位a(

3)=mod

(floor

(data1/

100),10

);% 百位

% 第二個數字2*ia

(4)=

mod(

2*data1,10)

;a(5

)=mod(

floor(2

*data1/10)

,10);

a(6)

=mod

(floor(2

*data1/

100),10

);% 第三個數字3*ia

(7)=

mod(

3*data1,10)

;a(8

)=mod(

floor(3

*data1/10)

,10);

a(9)

=mod

(floor(3

*data1/

100),10

);% 排列組合

for i=1:

8% 九個資料兩兩對比

for j =

(i +1)

:9if(

a(i)==a

(j)||

a(i)==0

||a(j)==0)

% 如果存在相等或者為0的資料,則退出

break

; end

end;

if(j <9)

% 迴圈結束

break

; end

end% 列印輸出

if i ==

8&& j ==

9% 全部遍歷結束則表示資料符合要求

fprintf

('方法1符合條件資料: a=%d,b=%d,c=%d\n'

, data1, data1*

2, data1*3)

;end

第二個方法參考了別人的。借助乙個110的初值為0陣列。

還是提取3個三位數的每一位,並在這個數的標號下置1,代表這個數字出現過。

如果每乙個陣列都出現過,那麼這個110的陣列就有9個1,1個0。

通過求和,陣列元素之和等於9,則表示9個數字各不相同。

同時需要排除數字為0的情況。

程式:

%

% method2: 格仔填充

for i=

123:

329

a=zeros(1

,10);

%1*10的陣列格仔

% 第乙個數

a(mod

(i,10)+

1)=1

;% 個位, 該序號位置填充為1a(

mod(

floor

(i/10),

10)+1

)=1;

% 十位

a(mod

(floor

(i/100),

10)+1

)=1;

% 百位

j=i*2;

a(mod(j,10)

+1)=

1;a(

mod(

floor

(j/10),

10)+1

)=1;

a(mod(

floor

(j/100),

10)+1

)=1;

k=i*3;

a(mod(k,10)

+1)=

1;a(

mod(

floor

(k/10),

10)+1

)=1;

a(mod(

floor

(k/100),

10)+1

)=1;

s=sum(a)

;% 十個數求和

if(s==9&&

a(1)

~=1)

% s==

9的話表示有9個不同的數字,a(

1)==1等價於數字0

fprintf

('方法2符合條件資料: a=%d,b=%d,c=%d\n'

, i, j,k)

; end

end

一道演算法題

兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...

一道演算法題

1.上午主要做了對翻譯任務的劃分,下午把 翻譯完畢。2.明天要講的演算法題 對乙個集合,求出其連續元素組成的子集中,和最大的子集 我對這道題的理解是 1 若集合中最小值大於0,意味著所有的都大於0,則最大的子集和,為所有值加起來 2 若集合中最大值小於0,意味著所有的都小於0,則最大的子集和,為集合...

一道演算法題

include using namespace std const int size 5 int max sub array const int a,int n,int m int max matrix const int a size int row,int col,int subsize int...