Rumah > Soal Jawab > teks badan
大家讲道理2017-04-18 10:55:25
Ini. . . Saya tidak tahu bagaimana untuk meletakkannya. . .
Andaikan ada n orang kesemuanya, tiga orang berturut-turut, lima orang berturut-turut, dan tujuh orang berturut-turut Tengok barisan terakhir dengan a, b, c orang yang tinggal
Bukan ?
n % 3 = a
n % 5 = b
n % 7 = c
Bukankah ini sangat mudah?
Kaedah 1: Brute Force
n Cuba semuanya dari 10 hingga 100. Saya tidak perlu mengatakan ini
Kaedah 2: Kaedah matematik (menyelesaikan formula kongruen - matematik asas)
Contoh:
n % 3 = 2
n % 5 = 4
Apa yang boleh ditukar menjadi?
设 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
Jika ada tiga, kira dua dahulu dan kemudian yang ketiga.
天蓬老师2017-04-18 10:55:25
#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);
}
}
}