1. 程式人生 > >[南陽OJ-No.34]韓信點兵|相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數a,b

[南陽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;  
}