java - C语言算法题-韩信点兵 求解?
高洛峰
高洛峰 2017-04-18 10:53:25
0
2
675


完全不知道怎么下手??

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

Antworte allen(2)
大家讲道理

这个。。。不知道怎么说才好。。。

设共有 n 个人,三人一排,五人一排,七人一排,看最后一排剩下 a, b, c 人
不就是

n % 3 = a
n % 5 = b
n % 7 = c

下面不就很简单了么?
方法 1: 暴力
n 从 10 到 100 都试一下。这个不用我说了吧

方法 2: 数学方法(解同余式-初等数经)

例题:
n % 3 = 2
n % 5 = 4

可以转化成什么呢?

设 n / 3 = x 余 2, n / 5 = y 余 4
==> 3x + 2 = 5y + 4
==> 3x = 5y + 2
x,y 在 自然数的最小解是 x = 4, y = 2
==> n 最小是 12
3 和 5 的最小公倍数 = 15
所以 n % 15 == 12

三个的话,先算两个,再算第三个。

Peter_Zhu
#include <stdio.h>
#include <stdlib.h>

int met(int count, int pision, int remain) {
    return count % pision == remain;
}

int getMin(int i, int j, int k) {
    if (i == j && j == k) return -1;

    if (i >= 3) i %= 3;
    if (j >= 5) j %= 5;
    if (k >= 7) k %= 7;

    int count = 0;
    while(1) {
        if (count > 10) {
            if (met(count, 3, i) && met(count, 5, j) && met(count, 7, k)) {
                break;
            }
        }
        count++;
        if (count > 100) {
            count = -1;
            break;
        }
    }
    return count;
}

int main(int argc, char **args) {
    if (argc < 4) {
        printf("no enough params.");
    } else {
        int i = atoi(args[1]);
        int j = atoi(args[2]);
        int k = atoi(args[3]);
        int c = getMin(i, j, k);
        if (c == -1) {
            printf("no qualified number!");
        } else {
            printf("count = %d", c);
        }
    }
}
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!