OOC (L2) 语言解决 S先生与P先生谜题
前几天看到这篇Blog, Python解S先生与P先生谜题
正好写毕业设计的解释器的需要测试程序, 觉得实现一个这个问题的解法比实现快速排序之类的有趣多了。
(题目描述是从上面文章中拷贝过来的. )
题目:S先生与P先生谜题
设有两个自然数X、Y,2<=X<=Y<=99,S先生知道这两个数的和S,P先生知道这两个数的积P,
他们二人进行了如下对话:
- S:我确信你不知道这两个数是什么,但我也不知道。
- P: 一听你说这句话,我就知道这两个数是什么了。
- S: 我也是,现在我也知道了。
现在你能通过他们的会话推断出这两个数是什么吗?(当然,S和P先生都是非常聪明的)
我用OOC 语言实现 S先生与P先生谜题, 大体框架使用上面的文章中的内容
(关于OOC 语言的定义请查看L2Define
解释器由Python实现,可以从 http://code.google.com/p/finterpretor/ 获得.
)
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
class Main { const MIN = 2, MAX = 99; //只需要判断y的范围, 程序确保x的取值范围 static func int BaseCondition(int x, int y) { y >= MIN && y <= MAX && y >= x } //S先生的S分析 func int[][] S(int x, int y) { var int[][] ar; int s,i,len end s = x + y; len = s/2 + 1 - MIN; ar = new int[][len]; i = 0; while(i < len) ( ar[i] = new int[2]; ar[i][0] = i + MIN; ar[i][1] = s - i - MIN; i++ ); ar } //P先生的P分析 func int[][] P(int x, int y) { var int[][] ar; int p,i,len end p = x * y; i = MIN; len = 0; while( i <= p/i) ( if (p % i == 0 && BaseCondition(i, p/i)) len ++; i ++ ); ar = new int[][len]; i = MIN; len = 0; while( i <= p/i) ( if (p % i == 0 && BaseCondition(i, p/i)) ( ar[len] = new int[2]; ar[len][0] = i; ar[len][1] = p/i; len ++ ); i++ ); ar } //条件1 - S:我确信你不知道这两个数是什么,但我也不知道위ᅫ func int Condition1(int x, int y) { var int[][] s_sep; int i,ret end s_sep = S(x, y); ret = 1; if (s_sep.length == 1) ( ret = 0 ) else ( i = 0; while (ret && i < s_sep.length) ( if (P(s_sep[i][0], s_sep[i][1]).length <= 1) ret = 0; i++ ) ); ret } //条件2 - P: 一听你说这句话,我就知道这两个数是什么了。위ᅫ func int Condition2(int x, int y) { var int[][] p_sep; int i,ret end p_sep = P(x,y); i = 0 ; ret = 1; while (ret && i < p_sep.length ) ( if (x == p_sep[i][0] && y == p_sep[i][1]) ( ret ) else ( if (Condition1(p_sep[i][0], p_sep[i][1])) ( ret = 0 ) ); i++ ); ret } //条件3 - S: 我也是,现在我也知道了。위ᅫ func int Condition3(int x, int y) { var int[][] s_sep; int i,ret end s_sep = S(x,y); i = 0 ; ret = 1; while (ret && i < s_sep.length) ( if (x == s_sep[i][0] && y == s_sep[i][1]) ( ret ) else ( if (Condition2(s_sep[i][0], s_sep[i][1])) ret = 0 ); i++ ); ret } //需要同时满足上面3个条件 func int Condition(int x, int y) { Condition1(x, y ) && Condition2(x, y) && Condition3(x, y) } func void main() { var int i,j,x,y end i = MIN; x = 0; y = 0; while ( i <= MAX && x == 0 && y == 0) ( j = i; while(j < MAX && x == 0 && y == 0) ( print (i); println (j); if(Condition(i,j)) ( x = i; y = j ); j++ ); i ++ ); print (x); print (y) } } |
代码高亮由wp-syntax (基于 geshi) 提供,随便写了个语法文件.