题目:
请将123456789九个数字以特定的顺序排列,组成一个9位数ABCDEFGHI(每个数字只能使用一次),使得:
1.第一位数字组成的整数可以被1整除
2.第一、二位数字组成的整数可以被2整除
3.第一、二、三位数字组成的整数可以被3整除
4.第一、二、三、四位数字组成的整数可以被4整除
......
9.第一、二、三...九位数字组成的整数可以被9整除
分析:
通常想法是遍历9!=362280种排列。
其实第5位E一定是5,这样可缩减到8!=40320种排列
进一步分析,偶数位一定是偶数(BDFH={2,4,6,8}),奇数位一定是奇数(ACGI={1,3,7,9}),因而只需分析P(4,4)*P(4,4)=576种排列。
继续分析,4能整除 10*C+D,故D=2 或 6, 加之8能整除 10*G+H,故D,H={2,6},所以B,F={4,8},故需分析P(4,4)*P(2,2)*P(2,2)=48种排列
接着分析,3 能整除 100* D+ 10 * 5+ F,所以DEF={258 ,654},ABC,GHI能被3整除
如果DEF=258,则,ABC={147,741},GHI={369
,963},但1472589,7412589均不能被7整除,不符合条件,故DEF=654,
B=8,H=2.此时只有P(4,4)=24种排列
又7能整除A8C654G,故7整除(A+4C+G),而G={3,7},如果G=3,ABC为{189,789,981,987}均不满足条件,故G=7,此时ABC={183,189,381,981}中只有381符合条件,故ABCDEFGHI=381654729
此时如果需要写代码,一句就够了:
Debug.print 381654729
附几种解法:
由
提供
-
Sub
cnft()
-
-
-
Dim
a
-
-
Dim
strNums
As
String
-
strNums =
"1,2,3,4,5,6,7,8,9"
-
-
Dim
i, j, k
As
Integer
-
For
i = 2
To
9
-
a = Split(strNums,
","
)
-
strNums =
""
-
For
k = 0
To
UBound(a)
-
For
j = 1
To
9
-
If
(a(k) & j)
Mod
i = 0
Then
-
If
InStr(a(k), j) = 0
Then
-
strNums = strNums &
","
& a(k) & j
-
End
If
-
End
If
-
Next
j
-
Next
k
-
strNums = Right(strNums, Len(strNums) - 1)
-
Next
i
-
Erase
a
-
-
MsgBox (
"运行结果为:"
& strNums)
-
End
Sub
-
-
代码2:
(IP
提供)
-
Sub
Getit()
-
Dim
a, b, c, d, e, f, g, h, i
As
Integer
, num1, num2
As
String
, x
As
Double
-
e = 5: num1 =
"123456789"
: num2 =
"此数为:"
: t = Timer
-
For
a = 1
To
9
Step
2
-
If
a = e
Then
GoTo
10
-
For
b = 2
To
8
Step
2
-
For
c = 1
To
9
Step
2
-
x = a + b + c
-
If
c = a
Or
c = e
Or
Int(x / 3) <> x / 3
Then
GoTo
30
-
For
d = 2
To
8
Step
2
-
x = 10 * c + d
-
If
d = b
Or
Int(x / 4) <> x / 4
Then
GoTo
40
-
For
f = 2
To
8
Step
2
-
x = d + e + f
-
If
f = b
Or
f = d
Or
Int(x / 3) <> x / 3
Then
GoTo
60
-
For
g = 1
To
9
Step
2
-
x = a * 1000000 + b * 100000 + c * 10000 + d * 1000 + e * 100 + f * 10 + g
-
If
g = a
Or
g = c
Or
g = e
Or
Int(x / 7) <> x / 7
Then
GoTo
70
-
For
h = 2
To
8
Step
2
-
x = 10 * g + h
-
If
h = b
Or
h = d
Or
h = f
Or
Int(x / 8) <> x / 8
Then
GoTo
80
-
For
i = 1
To
9
Step
2
-
If
i = a
Or
i = c
Or
i = e
Or
i = g
Then
GoTo
90
-
num2 = num2 + Mid(num1, a, 1) + Mid(num1, b, 1) + Mid(num1, c, 1)
-
num2 = num2 + Mid(num1, d, 1) + Mid(num1, e, 1) + Mid(num1, f, 1)
-
num2 = num2 + Mid(num1, g, 1) + Mid(num1, h, 1) + Mid(num1, i, 1)
-
num2 = num2 + Chr(13) + Chr(10) +
"计算时间:"
+ Str(Timer - t) +
"秒"
-
MsgBox (num2)
-
90:
-
Next
i
-
80:
-
Next
h
-
70:
-
Next
g
-
60:
-
Next
f
-
40:
-
Next
d
-
30:
-
Next
c
-
20:
-
Next
b
-
10:
-
Next
a
-
End
Sub
代码3
(
提供)
<!-- -->
-
Dim
x, s
As
String
-
Sub
cai()
-
Call
caii(
""
, 0)
-
MsgBox s
-
End
Sub
-
Sub
caii(a, i)
-
For
j = 1
To
9
-
If
Not
(a
Like
"*"
& j &
"*"
)
And
(a & j)
Mod
(i + 1) = 0
Then
-
If
i + 1 = 9
Then
-
s = s & a & j & vbCrLf
-
Else
-
Call
caii(a & j, i + 1)
-
End
If
-
End
If
-
Next
j
-
End
Sub
代码4:
-
Sub
cnft()
-
getNum
-
End
Sub
-
-
Sub
getNum(
Optional
ByRef
strNums
As
String
=
""
,
Optional
ByRef
iTurn
As
Integer
= 1)
-
Dim
i
As
Integer
, tm
As
Single
-
tm = Timer
-
For
i = 1
To
9
-
If
InStr(strNums, i) = 0
Then
-
If
(strNums & i)
Mod
iTurn = 0
Then
-
If
iTurn = 9
Then
-
MsgBox strNums & i & vbCrLf &
"用时:"
& Timer - tm &
"秒"
-
Else
-
Call
getNum(strNums & i, iTurn + 1)
-
End
If
-
End
If
-
End
If
-
Next
i
-
End
Sub
代码5
-
Sub
macro1()
-
Dim
d, s, x, i
As
Long
, j
As
Long
, n
As
Currency, k
As
Long
, befit
As
Boolean
-
d = Array(1, 3, 7, 9)
-
s = Array(2, 4, 6, 8)
-
x = Split(
"0123 0132 0213 0231 0312 0321 1023 1032 1203 1230 1302 1320 2013 2031 2103 2130 2301 2310 3012 3021 3102 3120 3201 3210"
)
-
For
i = 0
To
23
-
For
j = 0
To
23
-
n = Val(d(Mid(x(i), 1, 1)) & s(Mid(x(j), 1, 1)) & d(Mid(x(i), 2, 1)) & s(Mid(x(j), 2, 1)) & 5 & s(Mid(x(j), 3, 1)) & d(Mid(x(i), 3, 1)) & s(Mid(x(j), 4, 1)) & d(Mid(x(i), 4, 1)))
-
befit =
True
-
For
k = 2
To
8
-
If
Not
Left(n, k)
Mod
k = 0
Then
befit =
False
:
Exit
For
-
Next
-
If
befit =
True
Then
Debug.Print n
-
Next
-
Next
-
End
Sub
分享到:
相关推荐
如果不存在0,那么我们需要检测数组中的每个数字的余数,对于余数为1和2的数字,我们可以删除最小的一个,直到数组中所有数字的余数之和能被3整除。最后,我们输出构建的最大整数。 代码实现: 以下是使用C++语言...
对于任何整数n,如果n的末三位数字组成的数x和去掉末三位后的数y满足以下条件,那么n就能被这三个数整除: 1. 如果y - x能够被7整除,那么n能被7整除。 2. 如果x - y能够被11整除,那么n能被11整除。 3. 如果y - x...
7. 用0,5,8三个数字组成的三位数能同时被2,5整除,则最小的三位数是508。 8. 2的倍数:36, 90, 102, 10, 22, 290, 634 5的倍数:90, 75, 10, 290, 985, 630 9. 能力检测题解: - 使这个数能被2整除的三位数是...
答案是D,解析是n个点最多n(n+1)/2条边,要不连通,至少去掉n-1条边n(n+1)/2-(n-1)≥28,n最小为8。 试题9:一些数字可以颠倒过来看,例如0、1、8颠倒过来看还是本身,6颠倒过来是9,9颠倒过来看还是6,其他数字...
本题目的目标是通过循环结构来生成所有由1、2、3、4这四个数字组成且为素数的数,并按照从小到大的顺序输出。这里我们将详细解析如何实现这个程序。 首先,我们需要了解什么是素数。素数是指除了1和它自身外,不能...
- 从1, 2, 3, 4, 5, 6中选择数字组成能被每个数字整除的最小数,通过排除法和整除特征,可以确定组成数字为122364。 通过掌握整除的性质和特征,不仅能解决简单的数学问题,还能应对复杂的应用题,培养学生的数学...
--实现函数,打印出所有用1,2,3,4四个数字组成的各位数都不重复的三位数(例如234) --实现函数,打印出2000以内所有能被7整除的数,并返回个数 --实现函数,将数组从小到大排序后输出 --实现函数,输出9*9的国际...
- 能被3、9整除的数,其所有位上的数字之和也必须能被3、9整除。 - 对于7、11、13的整除性,可以通过将数分为末三位数和剩余部分,并计算二者之差来判断。如果该差能被7、11、13整除,则原数也能被它们整除。 2. ...
同样,8要求百位、个位和十位组成的三位数可被8整除,9则要求所有数位上的数字和能被9整除。10的特征是末位为0,意味着同时被2和5整除。 对于11,可以通过奇数位数字和偶数位数字的差来判断,如果差能被11整除,...
在这个C语言编程问题中,我们需要编写一段代码,它能接收用户通过键盘输入的一个三位数的正整数,然后检查这个数的个位数和百位数之和是否等于它的十位数。如果相等,程序将输出"Yes",否则输出"No"。下面我们将详细...
10. **满足特定条件的三位数**:一个三位数既能被2整除,又能被3整除,且个位、十位上相同,这个三位数最大是996,因为个位和十位相同且最大是9,同时要满足被2和3整除,所以百位是9。 11. **3和5的倍数特征**:0, ...
此段代码的目标是找出一个由多个9组成的数,使得该数能被用户输入的数整除。首先通过 `scanf` 获取用户输入的数 `zi`。然后使用 `while` 循环不断尝试增加9的数量,直到找到符合条件的数为止。循环内部首先判断当前...
6. 要使六位数8264的左右各添一个数码后能被45整除,意味着这个新的数既是9的倍数又是5的倍数。9的倍数条件是所有位数字之和是9的倍数,5的倍数条件是末尾是0或5。结合这两个条件,我们可以找出符合条件的六位数。 ...
【例7】这题要求组成一个被667整除的6位数,需要分析667的因数,以及利用整除的性质来确定数字排列。 【例9】小马虎看错数字导致的乘积是1872,可以通过除以8(5和8相差3)找到原始乘积。 【例10】两个互质的合数...
一个三位数,各位数字互不相同,十位数字比个位、百位数字之和还要大,且十位、百位数字之和不是质数。编程找出所有符合条件的三位数。 注:1. 不能手算后直接打印结果。 2. “质数”即“素数”,是指除1和自身...
**问题描述**:猴子第一天摘桃并吃掉一半再多吃一个,之后每天都吃前一天剩下的一半再多吃一个,到第10天只剩下1个桃子。求第一天摘了多少个桃子。 **解题思路**: - 采用逆向思维,从第10天往回推算。 - 设第\(n\)...
首先,我们来看第一个问题,即用2、3、4、0这四个数字组成没有重复数字的三位数。这个问题涉及到排列的概念,因为三位数的每一位数都不能重复。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列...
递归函数的关键在于确定递归结束条件(if(n==1||n==2)),并在非结束条件下,递归调用自身来累加结果(return fun(n-1)+fun(n-2))。 程序2要求判断指定范围内(101-200)有多少个素数,并输出这些素数。素数是指...
比如4位数时,回文数由对称的两半组成,因此首位和末位可以是1到9的任何数字,中间的位数可以是0到9,但因为是偶数位,中间需要对称,所以首位和末位的选择限制了中间的位数选择,导致总数为9×10^(k-1),其中k=n/2...