枫林在线>>程序设计>>讨论区 [快速回复] [上一主题] [下一主题] 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 标题: Re: 一道程序题
昵称: Cre∫endo 来自: 192.168.*.*
经验值: 80579 发贴时间: 2005年01月18日 13:06:57 (UTC +08:00)
等级: ★★★☆☆ 长度: 52字
...
只学过vb
果然理解容易
简单与复杂的辩证关系~~~
========== * * * * * ==========
作者: Numino 标题: Re: 一道程序题
昵称: !灵枢! 来自: 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 标题: Re: 一道程序题
昵称: 渺小・Happy^_^ 来自: 192.168.*.*
经验值: 12031 发贴时间: 2005年01月18日 13:42:36 (UTC +08:00)
等级: 博大精深 长度: 33字
注意两种解题思路都是穷举法。。。

========== * * * * * ==========
作者: crescendo 标题: Re: 一道程序题
昵称: Cre∫endo 来自: 192.168.*.*
经验值: 80638 发贴时间: 2005年01月18日 15:37:50 (UTC +08:00)
等级: ★★★☆☆ 长度: 121字

【 在 (渺小・Happy^_^) 的大作中提到: 】
: 注意两种解题思路都是穷举法。。。
: 

111xy=1111z or 121xy=1111z

这样的思路?
========== * * * * * ==========
每页条 |◀ ◀ 第/4页 ▶|
Top

| 用户注册 | 密码重置 | 在线用户 | 常见问题 |

Copyright © 2001-2025 枫林在线(www.FengLin.info) All Rights Reserved
时间显示基于用户时区设置:Asia/Shanghai (UTC +08:00)
页面运行使用31.01毫秒