java韩信点兵_C语言算法题-韩信点兵 求解?汗血宝马

这篇博客探讨了如何解决编程题目中的韩信点兵问题,即寻找满足特定余数条件的人数。通过数学方法和暴力求解两种方式,详细解释了如何找到满足3、5、7除后余数的最小正整数解。并给出了C语言的代码实现。
摘要由CSDN通过智能技术生成

696161a0c9e539503f9cd5f099ea349f.png

完全不知道怎么下手??

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

设共有 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

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

#include <stdio.h>

#include <stdlib.h>

int met(int count, int division, int remain) {

return count % division == 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);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值