嗨,这是一个问题:
炎热的夏日,皮特和他的朋友比利决定买一个西瓜。他们认为,他们选择了最大,最成熟的一个。此后,称重西瓜,秤重为w千克。他们赶回家,渴死了,决定把浆果分开,但是他们面临着一个难题。

皮特(Pete)和比利(Billy)是偶数的忠实拥护者,这就是为什么他们希望以这样的方式对西瓜进行分割,使两个部分中的每一个重偶数公斤,而同时不必强制两个部分相等。男孩们非常疲倦,想尽快开始用餐,这就是为什么您应该帮助他们并找出他们是否可以按照自己的方式分配西瓜的原因。可以肯定的是,他们每个人都应该得到一部分正体重。

输入:第一行(也是唯一的)输入行包含整数w(1≤w≤100)-男孩购买的西瓜的重量。

输出:打印YES,如果男孩们可以将西瓜分为两部分,每部分重为几公斤;而在相反情况下则为“否”。

我已经试过了这段代码。

#include <stdio.h>

int main () {
    int w,i,b;

    i=w%b;
    printf("enter the weight");
    scanf("%d", &w);
    for (b=2;b<=10;b=b+2) {
        if (i==0 && i&2==0) {
            printf("YES");
        } else {
            printf("NO");
        }
    }
    return 0;
}


但它没有显示任何正确的输出。你能告诉我我在这里想念什么吗?

最佳答案

继续从注释开始,w应该为unsigned int,因为您的权重不能为负。此外,如果最低有效位是1,则数字是odd。将它们放到一个简单的mellon分割算法中,您可以执行以下操作来确定每个像素是否可以具有均匀的加权切片:

#include <stdio.h>

int main (int argc, char **argv) {

    int i, j, wt = 0;

    for (i = 1; i < argc && sscanf (argv[i], "%u", &wt) == 1; i++) {
        int sliced = 0;
        if (wt & 1) goto odd;
        for (j = 0; j < wt/2; j++) {
            if (!(((wt/2 - j) & 1) | ((wt/2 + j) & 1))) {
                printf (" %3u - Yes (one gets %u, other %u)\n", wt,
                        wt/2 - j, wt/2 + j);
                sliced = 1;
                break;
            }
        }
        odd:;
        if (!sliced) printf (" %3u - No\n", wt);
    }

    return 0;
}


使用/输出示例

$ for i in {1..20}; do ./bin/evenmellons $i; done
   1 - No
   2 - No
   3 - No
   4 - Yes (one gets 2, other 2)
   5 - No
   6 - Yes (one gets 2, other 4)
   7 - No
   8 - Yes (one gets 4, other 4)
   9 - No
  10 - Yes (one gets 4, other 6)
  11 - No
  12 - Yes (one gets 6, other 6)
  13 - No
  14 - Yes (one gets 6, other 8)
  15 - No
  16 - Yes (one gets 8, other 8)
  17 - No
  18 - Yes (one gets 8, other 10)
  19 - No
  20 - Yes (one gets 10, other 10)


要计算并查看朋友可以共享的所有可能的加权切片组合,您可以简单地忽略中断。通过将中断包装在其自己的定义中,可以使它在编译阶段是可选的。例如:

#ifndef SHOWALL
                break;
#endif


对于正常行为,照常进行编译,使用-DSHOWALL进行编译以计算并显示所有可能的切片组合。

10-01 22:35