有乘法算式如下:
○○○× ○○
------------
○○○○
○○○○
------------
○○○○○
18個○的位置上全部是素數(1、3、5或7),請還原此算式。
*問題分析與演算法設計
問題中雖然有18數字,但只要確定乘數和被乘數後經過計算就可確定其它的數字。
乘數和被乘數共有5個數字,要求每個數都是質數。完全可以採用窮舉的方法對乘數和被乘數進行窮舉,經過判斷後找出答案。但是這種方法給人的感覺是「太笨了」,因為組成的數字只是質數(4個),完全沒有必要在那麼大的範圍內進行窮舉,只需要試探每一位數字為質數時的情況即可。
採用五重迴圈的方法實現對於5個數字的窮舉,前面的許多例題中都已見過。迴圈實現簡單易行,但巢狀的層次太多,需要窮舉的變數的數量直接影響到迴圈巢狀的層數,這種簡單的實現方法缺少技巧性。本例的程式中給出了另外一種同樣功能的演算法,該演算法的實現思想請閱讀程式。
程式中並沒有直接對質數進行窮舉,而是將每個質數與1到4順序一一對應,在窮舉時為處理簡單僅對1到4進行窮舉處理,待要判斷產生的乘積是否滿足條件時再利用乙個陣列完成向對應質數的轉換。請體會程式中的處理方法。程式中使用的演算法實際上是回朔法。
*程式說明與注釋
#include
#define num 5 /*需要窮舉的變數數目*/
#define c_num 4 /*每個變數的值的變化範圍*/
int a[num+1]; /*為需要窮舉的變數開闢的陣列*/
/*a[1]:被乘數的百位,a[2]:十位,aa[3]:個位 a[4]:被乘數的十位 a[5]:個位*/
int b=; /*存放質數數字的陣列,不使用第0號元素*/
int f(long sum);
int main()
i=num; /*為窮舉下乙個可能取值作準備*/}}
}int f(long sum) /*判斷sum的每一位數字是否是質數,若不是返回0,若是返回1*/
if(!flag) return 0;
else sum=sum/10;
}return 1;
}*執行結果
7 7 5
× 3 3
----------
2 3 2 5
2 3 2 5
-----------
2 5 5 7 5
*思考題
以下乘式中,a、b、c代表一確定的數字,○代表任意數字,請復原。
a b c 2 8 6
× b a c × 8 2 6
------------- 答案: ------------
○○○○ 1 7 1 6
○○a 5 7 2
○○○b 2 2 8 8
------------- ----------------
○○○○○○ 2 3 6 2 3 6
(百題程式設計)64 乘式還原
題目 a代表數字0到9中的前五個數字,z代表後五個數字,請還原下列乘式。a z a a a z a a a a a a z z z a a z a z a a 題目 a代表數字0到9中的前五個數字,z代表後五個數字,請還原下列乘式。a z a a a z a a a a a a z z z a a ...
數乘2操作
1.掌握所學的概念和基本結構,理解圖靈機的基本指令和編碼方式。include include typedef struct ndoe lnode lnode creat return h lnode insertlist lnode l 插0 l l next return l lnode inse...
乘2取整法 關於乘2取整法?
學習二進位制,最好的方法就是模擬。考慮乙個十進位制小數0.123,我們可以用 乘10取整 法得到它的每一位小數 第一位小數是0.123 10 1.23,取整數1 第二位小數 0.23 10 2.3,取整數2 上面的方法供你直觀理解,下面我從數學的角度分析其中的原理。現在有乙個十進位制小數為0.625...