枫林在线>>程序设计>>讨论区 [快速回复] [上一主题] [下一主题] | C/(C语言) |
[323167] 主题: 一道程序题 |
作者: little |
标题:
![]() |
|
昵称: 渺小・Happy^_^ | 来自: 192.168.*.* | |
经验值: 11963 | 发贴时间: 2005年01月18日 12:49:22 (UTC +08:00) | |
等级: 博大精深 | 长度: 2604字 | |
![]() |
题目: 使用1-8这8个数字,组成abc*d=efgh或者ab*cd=efgh形式的等式。要求,每个数字被使 用1次。求出所有不重复的解。 解答一(VB) 比较容易想到但十分繁琐的解题思路 Dim i, j, k, l, m, n, o, p As Integer For i = 1 To 8 For j = 1 To 8 Do While j = i And j < 8 j = j + 1 Loop For k = 1 To 8 Do While (k = j Or k = i) And k < 8 k = k + 1 Loop For l = 1 To 8 Do While (l = k Or l = j Or l = i) And l < 8 l = l + 1 Loop For m = 1 To 8 Do While (m = l Or m = k Or m = j Or m = i) And m < 8 m = m + 1 Loop For n = 1 To 8 Do While (n = m Or n = l Or n = k Or n = j Or n = i) And n < 8 n = n + 1 Loop For o = 1 To 8 Do While (o = n Or o = m Or o = l Or o = k Or o = j Or o = i) And o < 8 o = o + 1 Loop For p = 1 To 8 Do While (p = o Or p = n Or p = m Or p = l Or p = k Or p = j Or p = i) And p &l t; 8 p = p + 1 Loop If p <> o And p <> n And p <> m And p <> l And p <> ; k And p <> j And p <> i And o <> n And o <> m And o &l t;> l And o <> k And o <> j And o <> i And j <> i And k <> j And k <> i And l <> k And l <> j And l <> i And m <> l And m <> k And m <> j And m <> i And n < > m And n <> l And n <> k And n <> j And n <> i Then If (i * 100 + j * 10 + k) * l = m * 1000 + n * 100 + o * 10 + p Then Print i; j; k; "*"; l; "="; m; n; o; p ElseIf (i * 10 + j) * (k * 10 + l) = m * 1000 + n * 100 + o * 10 + p And i * 1 0 + j < k * 10 + l Then Print i; j; "*"; k; l; "="; m; n; o; p End If End If Next p Next o Next n Next m Next l Next k Next j Next i 解答二(C) 一种效率较高但比较难理解的解题思路 #include <stdio.h> #define MAX_DIGIT 8 #define BUFFER_LEN 9 int main () { int i, pos = 0, digit, result; int x, y, z; for (i = 0; i < BUFFER_LEN; i++) digit = 0; for (i = 0; i < BUFFER_LEN; i++) result = 0; while (pos >= 0) { //Search available digit for (i = result + 1; i <= MAX_DIGIT; i++) { if (digit == 0) { digit] = 0; digit = 1; result = i; i = result; if (pos == MAX_DIGIT) { //abc * d = efgh x = result * 100 + result * 10 + result; y = result; z = result * 1000 + result * 100 + result * 10 + result; if (x * y == z) printf ("%d * %d = %dn", x, y, z); //ab * cd = efgh x = result * 10 + result; y = result * 10 + result; if ((x <= y) && (x * y == z)) printf ("%d * %d = %dn", x, y, z); pos--; } } } if (pos == 0) break; digit] = 0; result = 0; } return 0; } 个人推荐使用C语言实现的那种方法,不过实在不懂的用VB的那种也可以。 -- ※作者已于 2005-01-18 18:28:10 修改本文※ |
|
========== * * * * * ==========
|
作者: crescendo |
标题:
![]() |
|
昵称: Cre∫endo | 来自: 192.168.*.* | |
经验值: 80579 | 发贴时间: 2005年01月18日 13:06:57 (UTC +08:00) | |
等级: ★★★☆☆ | 长度: 52字 | |
![]() |
... 只学过vb 果然理解容易 简单与复杂的辩证关系~~~ |
|
========== * * * * * ==========
|
作者: Numino |
标题:
![]() |
|
昵称: !灵枢! | 来自: 192.168.*.* | |
经验值: 51881 | 发贴时间: 2005年01月18日 13:16:49 (UTC +08:00) | |
等级: ☆☆☆☆☆ | 长度: 3081字 | |
![]() |
真的考试时,肯定用穷举法的~~ 【 在 (渺小・Happy^_^) 的大作中提到: 】 : 题目: : 使用1-8这8个数字,组成xxx*y=zzzz或者xx*yy=zzzz形式的等式。要求,每个数 : 字被使用1次。求出所有不重复的解。 : : : 解答一(VB) : 比较容易想到但十分繁琐的解题思路 : : Dim i, j, k, l, m, n, o, p As Integer : For i = 1 To 8 : For j = 1 To 8 : Do While j = i And j < 8 : j = j + 1 : Loop : For k = 1 To 8 : Do While (k = j Or k = i) And k < 8 : k = k + 1 : Loop : For l = 1 To 8 : Do While (l = k Or l = j Or l = i) And l < 8 : l = l + 1 : Loop : For m = 1 To 8 : Do While (m = l Or m = k Or m = j Or m = i) And m < 8 : m = m + 1 : Loop : For n = 1 To 8 : Do While (n = m Or n = l Or n = k Or n = j Or n = i) And n < 8 : n = n + 1 : Loop : For o = 1 To 8 : Do While (o = n Or o = m Or o = l Or o = k Or o = j Or o = i) And o < 8 : o = o + 1 : Loop : For p = 1 To 8 : Do While (p = o Or p = n Or p = m Or p = l Or p = k Or p = j Or p = i) A : nd p < 8 : p = p + 1 : Loop : If p <> o And p <> n And p <> m And p <> l And p <& gt; k And p <> j And p <> : i And o <> n And o <> m And o <> l And o <> k And o & lt;> j And o <> i And : j <> i And k <> j And k <> i And l <> k And l <> j And l <> i And m <> l : And m <> k And m <> j And m <> i And n <> m And n < > l And n <> k And n < : > j And n <> i Then : If (i * 100 + j * 10 + k) * l = m * 1000 + n * 100 + o * 10 + p Then : Print i; j; k; "*"; l; "="; m; n; o; p : ElseIf (i * 10 + j) * (k * 10 + l) = m * 1000 + n * 100 + o * 10 + p An : d i * 10 + j < k * 10 + l Then : Print i; j; "*"; k; l; "="; m; n; o; p : End If : End If : Next p : Next o : Next n : Next m : Next l : Next k : Next j : Next i : : : 解答二(C) : 一种效率较高但比较难理解的解题思路 : : #include <stdio.h> : #define MAX_DIGIT 8 : #define BUFFER_LEN 9 : : int : main () : { : int i, pos = 0, digit[BUFFER_LEN], result[BUFFER_LEN]; : int x, y, z; : : for (i = 0; i < BUFFER_LEN; i++) : digit[i] = 0; : : for (i = 0; i < BUFFER_LEN; i++) : result[i] = 0; : : while (pos >= 0) : { : //Search available digit : for (i = result[pos] + 1; i <= MAX_DIGIT; i++) : { : if (digit[i] == 0) : { : digit[result[pos]] = 0; : digit[i] = 1; : result[pos++] = i; : i = result[pos]; : : if (pos == MAX_DIGIT) : { : //xxx * y = zzzz : x = result[0] * 100 + result[1] * 10 + result[2]; : y = result[3]; : z = : result[4] * 1000 + result[5] * 100 + result[6] * 10 + : result[7]; : if (x * y == z) : printf ("%d * %d = %dn", x, y, z); : //xx * yy = zzzz : x = result[0] * 10 + result[1]; : y = result[2] * 10 + result[3]; : if ((x <= y) && (x * y == z)) : printf ("%d * %d = %dn", x, y, z); : : pos--; : } : } : } : if (pos == 0) : break; : : digit[result[pos]] = 0; : result[pos--] = 0; : } : : return 0; : } : : : 个人推荐使用C语言实现的那种方法,不过实在不懂的用VB的那种也可以。 : : -- |
|
========== * * * * * ==========
|
作者: little |
标题:
![]() |
|
昵称: 渺小・Happy^_^ | 来自: 192.168.*.* | |
经验值: 12031 | 发贴时间: 2005年01月18日 13:42:36 (UTC +08:00) | |
等级: 博大精深 | 长度: 33字 | |
![]() |
注意两种解题思路都是穷举法。。。 |
|
========== * * * * * ==========
|
作者: crescendo |
标题:
![]() |
|
昵称: Cre∫endo | 来自: 192.168.*.* | |
经验值: 80638 | 发贴时间: 2005年01月18日 15:37:50 (UTC +08:00) | |
等级: ★★★☆☆ | 长度: 121字 | |
![]() |
【 在 (渺小・Happy^_^) 的大作中提到: 】 : 注意两种解题思路都是穷举法。。。 : 111xy=1111z or 121xy=1111z 这样的思路? |
|
========== * * * * * ==========
|
![]() ![]() |
Copyright © 2001-2025 枫林在线(www.FengLin.info) All Rights Reserved
时间显示基于用户时区设置:Asia/Shanghai (UTC +08:00)
页面运行使用31.01毫秒