[南陽OJ-No.34]韓信點兵|相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數a,b
南陽OJ-No.34
時間限制3000ms,記憶體限制65535KB,**難度1**
描述
相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7),輸出總人數的最小值(或報告無解)。已知總人數不小於10,不超過100 。
輸入
輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7)。例如,輸入:2 4 5
輸出
輸出總人數的最小值(或報告無解,即輸出No answer)。例項,輸出:89
樣例輸入
2 1 6
樣例輸出
41
背景小故事
韓信點兵的成語來源淮安民間傳說:劉邦曾經問他:你覺得我可以帶兵多少?韓信:最多十萬。劉邦不解的問:那你呢?韓信自豪地說:越多越好,多多益善嘛!劉邦半開玩笑半認真的說:那我不是打不過你?韓信說:不,主公是駕馭將軍的人才,不是駕馭士兵的,而將士們是專門訓練士兵的。
淮安民間傳說著一則故事——“韓信點兵”,其次有成語“韓信點兵,多多益善”。韓信帶1500名兵士打仗,戰死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。韓信馬上說出人數:1049。
思路
思路一:
最終的所求數num一定是被3整除後餘x,被5整除後餘y,被7整除後餘z,且10<=num<=100。所以便利條件尋找即可。
思路二:
條件歸併:找到X,Y,Z三個陣列,分別存放除以3餘x的數,除以5餘x的數,除以3餘y的數。
定義新方法,輸入兩個陣列,返回兩陣列中第一個相同的數。
先對X,Y進行方法運算得到m,構建陣列W除以m餘(3*5=15)
對W,Z進行方法運算得到n,則最終結果=n+x*y*z。
凡是用3個一數剩下的餘數,將它用70去乘(因為70是5與7的倍數,而又是以3去除餘1的數);5個一數剩下的餘數,將它用21去乘(因為21是3與7的倍數,又是以5去除餘1的數);7個一數剩下的餘數,將它用15去乘(因為15是3與5的倍數,又是以7去除餘1的數),將這些數加起來,若超過105,就減掉105,如果剩下來的數目還是比105大,就再減去105,直到得數比105小為止。
JAVA
思路一
時間20,記憶體61
import java.util.Scanner;
public class Main {
public static Scanner cin = new Scanner(System.in);
public static int x, y, z, num;
public static void main(String[] args) throws Exception {
x = cin.nextInt();
y = cin.nextInt();
z = cin.nextInt();
for (int i=10; i<=100; i++) {
if ((i-x)%3==0) {
if ((i-y)%5==0) {
if ((i-z)%7==0) {
System.out.println(i);
break;
}
}
}
num = i;
}
if(num == 100) {
System.out.println("No answer");
}
}
}
C++
思路一
時間0,記憶體240
#include <iostream>
using namespace std;
int main()
{
int x, y, z, num;
cin >> x >> y >> z;
for (int i=10; i<=100; i++) {
if ((i-x)%3==0) {
if ((i-y)%5==0) {
if ((i-z)%7==0) {
cout << i;
break;
}
}
}
num = i;
}
if(num == 100) {
cout << "No answer";
}
}
思路二
時間4,記憶體240
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin >> a >> b >> c;
int n=(a*70+b*21+c*15)%105;
if(n>100||n<10)
cout << "No answer" << endl;
else
cout << n << endl;
}