- 论坛徽章:
- 0
|
本帖最后由 shymn 于 2010-08-20 09:16 编辑
看了这么多,jeasun写的与我所想的一样,不过后面的不一样
假设x,y,z,5x+7y+12z=w;
那么
1) x,y异号,z=0 5x+7y=w {5, -7}, {-5, 7}
2) x>0, y=0(或x=0, y>0), z>0 5x+12z=w 或 7y+12z=w {5, 12}, {7, 12}
3) x>0, y=0(或x=0, y>0), z=0 5x=w 或 7y=w {5}, {7}
4) x=0, y=0, z>0 12z=w {12}
改一下好看些, 下面的x,y,z>0, 对于给定的w只会有下列几种:
第一组:5x+12z=w, 7y+12z=w
第二组:5x=w, 7y=w, 12z=w
第三组:5x-7y=w, -5x+7y=w
程序可以这样想:
迭代地减去12,直到w<0且能够被5或7整除(至于为什么减去12,很多人应该已经猜到了,上面三组式子都(显示或隐式)有12出现,5-12能被7整除,7-12能被5整除,还有一点,-12不可能出现)
我证明了:
逐次减去12会有: 第一组 --> 第二组 [--> 第三组 --> -5a=w 或 -7b=w]
5x+12z=w --> 5x=w'(w'=w-12z) --> 5(x-x')-7x'=w''(w''=w'-12x') --> 最后一定是-7x=w'''<0
..................... 若w'==0--> 12z=w
举个例子,就设w=1
w-12 = -11 k = 1
-11-12 = -23 k = 2
-23-12 = -35 k = 3
-35小于0能被7整除得-5(也能被5整除但是从大到小)
;
q = |-5| = 5
因为是被7整除且q > k, 所以一定是第三组中的5x-7y=w(这是证明后的结论)
马上可以知道x = k = 3, y = q-k = 2
结果是-7*2+5*3,总共5个
如果之前拿5去除,结果就是-5*4+7*3,总共7个
另外若w=40,并不是8个5,而是4个7和1个12
代码如下,没写注释:- #include <stdio.h>
- #include <stdlib.h>
- int main(int argc, char **argv)
- {
- int w, q, i, k;
- if (argc < 2) {
- fprintf(stderr, "Usage: %s w ...", argv[0]);
- exit(0);
- }
- for (i = 1; i < argc; i++) {
- printf("%s: ", argv[i]);
- w = atoi(argv[i]);
- for (k = 0; w > 0 || (w%7 && w%5); k++)
- w -= 12;
- if (w == 0)
- printf("(12)*%d\n", k);
- else if (w%7 == 0) {
- q = w/7 >= 0 ? w/7 : -w/7;
- if (q > k)
- printf("(-7)*%d + (5)*%d\n", q-k, k);
- else if (q == k)
- printf("(5)*%d\n", q);
- else
- printf("(5)*%d + (12)*%d\n", q, k-q);
- }
- else if (w%5 == 0) {
- q = w/5 >= 0 ? w/5 : -w/5;
- if (q > k)
- printf("(-5)*%d + (7)*%d\n", q-k, k);
- else if (q == k)
- printf("(7)*%d\n", q);
- else
- printf("(7)*%d + (12)*%d\n", q, k-q);
- }
- }
- }
复制代码 |
|