1.2 倍和數與倍積數
本節介紹涉及自身數字構成的另一類新穎整數:優美倍和數與倍積數。
這類整數的“優美”是指其組成數字不重復,“和”是指組成該數的各數字之和,“積”是指組成該數的各數字之積。
1.2.1 優美倍和數
定義:由n個互不相同的數字(可含數字0)組成的n位整數x若是其n個數字之和s的整數m倍,即有
x=m×s
則稱整數x為n位優美倍和數,整數m為對應的倍數。
例如,上面求得的水仙花數407的3個數字之和為11,407=37×11,407就是一個3位優美倍和數,37為相應倍數。
【問題1】 試求3位優美倍和數的倍數m的最大值。
【思考】 以m的表達式為依據,逐個數字試驗探求。
設3位優美倍和數x的3個互不相同數字為a,b,c,即x=100a+10b+c,s=a+b+c,則

由表達式看,分母中a,b,c是平等的,但分子就不一樣了,相差很大。
基本思路:求取倍數m最大時,通常取a>b>c,當然以x能被s整除為前提。若x不能被s整除,則通常在較小的數字b,c中局部調整。
據式(1),要使m最大,在x能被s整除的前提下,取c盡可能小,不妨取c=0,則

據式(2),對任何a取值,要使m最大,b盡可能取最小,不妨取b=1,即有

據式(3),要使m最大,a可取最大9,此時m=91。
若取0<c≤9,可知m<91。
因而得:倍數m最大的3位優美倍和數為910,其相應的最大倍數為91。
【問題2】 探求3位優美倍和數的倍數m的最小值。
【思考】 同樣以m的表達式為依據,逐個數字試驗探求。
為求取倍數m的最小值,通常取a<b<c,同樣以x能被s整除為前提。若x不能被s整除,則在數字b,c中局部調整。
據式(1),取a=1,即有

由上式可知要使m最小,c應取最大,因而c從9開始遞減取值。
若取c=9,則,無論b取何值,m非整數,不符合要求。
若取c=8,則,要使m為整數,取b=9,得m=11;或取b=0,得m=12。
因而可得:a=1時,取x=198得m=11為最小。
據式(1),取a=2,有

由上式可知要使m最小,c盡可能取最大,因而c從9開始遞減取值。
若取c=9,則,要使m為整數,則取b=0,得m=19,顯然大于11。
若取c=8,則,要使m為整數,則取b=2(與a相同,舍去)或b=8(與c相同,舍去)。
若取c=7,則,要使m為整數,則取b=4,得m=19,顯然大于11。
依此a逐一遞增取值,得m均大于11。
因而得:倍數m最小的3位優美倍和數為x=198,其相應的最小倍數為m=11。
【拓展】 探索n位優美倍和數及其倍數m的最大值與最小值。
輸入正整數n(2≤n≤9),統計n位優美倍和數的個數,求出倍數m的最大值與最小值,并輸出對應m最大與最小時的n位優美倍和數。
1. 設計要點
(1)枚舉與分離數字。首先通過循環求出n位沒有重復數字的最小與最大整數a,b,然后設置x(a~b)循環枚舉n位整數;然后對每一個n位整數x應用整除/與取余%操作,分離x的n個數字k;最后通過求和s+=k;得到x的n個數字和s。
(2)統計與判別。應用f數組f[k]++;統計數字k的頻數,以便排除各數字k存在相等的情形;然后判別x能否被s整除:若x能被s整除,則產生一個n位優美倍和數x及其倍數m=x/s,用變量i統計優美倍和數個數。
(3)比較求最值。通過比較求取倍數m的最大值max與最小值min,并分別記錄m最大、最小時的x與s的值,為輸出m最大與最小時的優美倍和數提供數據。
2. 探求程序設計

3. 程序運行示例與變通
請輸入位數n(2≤n≤9):4 4位優美倍和數共645個。 倍數m最大為760:9120=760×12 倍數m最小為61:1098=61×18
如果輸入n=3,即可得3位優美倍和數的個數及它們的倍數的最大值與最小值。
當n比較大時,例如n=8,9,程序的運行相應變慢。建議通過輸入不同整數n值運行程序,具體感受枚舉時間的差異。
變通:把組成數字排除0,保留n個數字互不相同,即組成n位整數的n個數字限定為互不相同的正數。
在以上搜索程序中測試整數x是否有重復數字時還需測試n個數字是否含0,即把程序中的測試條件進行以下改變:f[k]>1改為f[k]>1||f[0]>0。這一變通,可得n位不含0的優美倍和數的相應結果。例如,當n=4時,程序運行結果如下所示。
請輸入位數n(2≤n≤9):4 4位優美倍和數共322個。 倍數m最大為534:9612=534×18 倍數m最小為71:1278=71×18
1.2.2 優美倍積數
定義:由n個互不相同的非零數字組成的n位整數x若是其n個數字之積t的整數m倍,即有
x=m×t
則稱整數x為n位優美倍積數,整數m為對應的倍數。
例如,3276的4個數字之積為252,3276=13×252,3276就是一個4位優美倍積數,13為對應倍數。
輸入正整數n(2≤n≤9),探求n位優美倍積數的個數,及n位優美倍積數的倍數m的最大值與最小值,并輸出倍數m最大與最小時對應的n位優美倍積數。
對于某些n,若沒有相應的n位優美倍積數,則予以指出。
1. 編程設計要點
(1)枚舉與分離。首先求出n位沒有重復非零數字的最小與最大整數a,b,然后設置x(a~b)循環枚舉n位整數;對每一個n位整數x應用整除/與取余%操作,分解x的n個數字k;通過求積t?=k;得到x的n個數字之積t。
(2)統計與判別。對每一整數應用f數組f[k]++;統計數字k的頻數,以排除各數字k存在相等(f[k]>1)的情形;然后判別x能否被t整除:若x能被t整除,則產生一個n位優美倍積數x及其倍數m=x/t,用變量i統計優美倍積數個數。
(3)比較求最值。通過比較求取倍數m的最大值max與最小值min,并分別記錄m最大、最小時的x與t的值,為輸出m最大與最小時的優美倍積數提供數據。
2. 探求n位優美倍積數程序設計

3. 程序運行示例與說明
請輸入位數n(2≤n≤9):5 5位優美倍積數共9個。 倍數m最大為167:64128=167×384 倍數m最小為19:12768=19×672
請修改程序,輸出指定n位所有優美倍積數。
這里引申出一個新的問題:對于指定的位數n,是否存在n位優美倍和同時倍積的整數?
4. 引申探求n位優美倍和積數
定義:如果n位整數x是優美倍和數,也是優美倍積數,則稱x為n位優美倍和積數。
例如,3位整數216,其數字之和為9,216=24×9;同時其數字之積為12,216=18×12;可見216就是一個3位優美倍和積數。
試修改以上程序,搜索并輸出指定n位所有優美倍和積數。
修改:
(1)增加統計數字和變量s,以及數字和的倍數j。
(2)求數字積時,同時求數字和:t?=k;s+=k;(s需先清零)
(3)判別數字積的倍數,同時判別數字和的倍數:(x%t==0&&x%s==0)
(4)計算數字積的倍數,同時計算數字和的倍數:m=x/t;j=x/s;
(5)修改輸出語句,并刪除有關最大最小操作。
例如,指定n=5時,程序運行結果如下所示。
請輸入位數n(2≤n≤9):5 1:12768=532×24,12768=19×672 2:13248=736×18,13248=69×192 3:13824=768×18,13824=72×192 4:18432=1024×18,18432=96×192 5:61824=2944×21,61824=161×384 5位優美倍和積數共5個。
顯然,以上輸出的5個5位優美倍和積數是上面9個5位優美倍積數的一個子集。其中,第2,3,4個優美倍和積數都是由1,2,3,4,8通過不同排列組成的5位數,以后將其稱為“變序數”。
- 數學不簡單:從《最強大腦》發現思維樂趣
- Foundations of Blockchain
- Data Visualization:a successful design process
- 輕輕松松學會微積分
- Origin 9.0科技繪圖與數據分析超級學習手冊
- 數學建模與數學規劃:方法、案例及編程實戰(Python+COPT/Gurobi實現)
- 其實你對數學的誤會很大(共5冊)
- MATLAB矩陣分析和計算
- 高等數學同步練習指導
- 怎樣解題:數學競賽攻關寶典(第3版)
- Blockchain By Example
- 迷人的數學(全2冊)
- 不可思議的自然對數
- 讓鴿子開公交車?:看不見的數學如何影響我們的日常
- Improving your C# Skills