Cプログラミング言語(1)100例:ケージとニワトリおよびウサギ

例1   鸡兔同笼

[問題の説明]

鶏肉とウサギオフケージ(2フィートの鶏、ウサギは例外なく、四本足を持っています)。既知のケージ足aの総数は、ケージと動物の数に少なくとも、アップがあるどのように多くの動物尋ねましたか?

[入力データ]

行1は、n個の入力ラインに続いて、テストデータのn個の集合です。ラインを示すテストデータの各セット(<32768)を含む正の整数。

出力[要件]

n行、出力の入力ラインに対応します。出力は、最初のものは、動物の最小数であり、2つの正の整数であり、動物の第二の最大数は、2つの正の整数は、スペースで区切られました。場合は、要件を満たすために、出力2 0を表示されない場合。

[サンプル入力】

2

3

20

[サンプル出力]

0 0

5 10

      (1)プログラミングのアイデア。

      2本の鶏の足があるので、ウサギは四本足を持っているので、ケージの中に足の総数は偶数でなければなりません。あなたは奇妙な足を持っている場合は、誤って入力。すなわち、例の要件を満たしていない、出力2 0を発生します。

最小限に偶数、動物の数であるとき、私たちは動物が四本足を持って作ってみる必要がありますが、動物の最大数に、動物は2フィートを持ってしてみてください。従ってちょうど分析上記網羅せずに循環して、本問題は、対応する計算式を求めます。

足の総数が最も/ 2(すべての鶏)で、/ 4(すべてのウサギ)に4の倍数、動物の最小数である場合。

動物の足の倍数の合計数が4でない場合は、最小数+ 1/4まで(鶏1、すべてのウサギの残りの部分を除く)、最も/ 2(すべての鶏)で。

このように、適切な選択を達成するために、単純な構造を書くことを決定し、それを出力計算されます。

      (2)ソース。

書式#include <stdio.hに>

メインint型()

{

   int型N、I、。

   scanf関数( "%のD"、&N);

   しばらく(N--)

   {

        scanf関数( "%のD"、&)。

              もし(%2!= 0)

          printf( "0 0 \ N");

        それ以外の場合(%4!= 0)

          printf( "%D%D \ n" は、/ 4 + 1/2)。

        他

          printf( "%D%D \ n" は、/ 4/2)。

   }

   0を返します。

}

 

問題1

1-1 P1348カップルの数

      この質問はロス・バレー試験(https://www.luogu.org/problem/P1348)から選択され、

説明[タイトル]

任意の整数Nは、他の2つの二乗整数aとbとの間の差として表すことができ、それは?もしそうなら、数Nは、カップルの数と呼ばれています。あなたの仕事は、Nはカップルの数ではない数を決定することです。

[入力形式]

唯一の行、整数N1範囲及び二つの長整数n2は、間にスペースで区切られました。

[出力形式]

N2にN1の範囲で出力どのように多くのカップルの数。

注:2つの数値を含むがN1とN2、およびN1 <N2、N2 - N1 <= 10 000 000。

[サンプル入力】

1 10

[サンプル出力]

7

       (1)プログラミングのアイデア。

          重要な問題は、この質問に数を決定する方法であるNのカップルの数ではありません。

           集合A = N 2 -b 2、N =(+ b)は(  AB)

        以来、bが整数、+ bとパリティAB同じ一定です。

        + bが奇数の場合、奇数奇数は奇数でなければならず、従ってNは奇数でなければなりません。

        + bが偶数の場合、偶数偶数は4の倍数を乗じなければならず、従って、N 4の倍数でなければなりません。

        カップルの数はどちらか奇数か4の倍数である、見ることができます。

        ターンでは、奇数の数や4の倍数、それはカップルの数が必要かどうか?私たちは、簡単に、AとBを構築することができます。

        Nが奇数の場合は、Nを設定することができる= 2K-1(kは整数)。好ましく= K、B = K- 1、 次いで、A = N 2 -b 2 =(A + B)(AB&)=。1-2K。

         Nが4の倍数である場合、N = 4Kは(kは整数)に設定することができます。好ましく= K + 1、B = K-1、 次いで、A = N 2 -b 2 =(A + B)(AB&)= 4K。

         Nは4の倍数ではなく偶数である場合、(A-Bのように(+ b)は、N = 2K(kは奇数である)、次いでN分解いずれの場合は、唯一の特定の奇数と偶数乗算に分解設定することができ)特定の奇数で他方が2の奇数倍です。Nは、2つの整数aとbとの間の差を二乗としてではなく、従って(+ b)が、パリティを有する(AB)とは表現できません。

        (2)ソース。

書式#include <stdio.hに>

メインint型()

{

    int型のN1、N2、I、CNT = 0;

       scanf関数( "%D%D"、およびN1、およびN2)。

    (I = N1; I <= N2; I ++)について

              (I%2!= 0 || I%4 == 0)の場合

                     CNT ++;

       printf( "%dの\ n" は、CNT)。

       0を返します。

}

 

1-2整数解

       HDU OJを選択したタイトル(http://acm.hdu.edu.cn/showproblem.php?pid=2092)

問題の説明

乗り上げに等しく、最後に、これはそれが存在するかどうか最終的には整数真か偽されている別の整数が、それは確か少しではありません、あなたはすぐにそれに答えることができ整数まで追加二つの整数がありますか?それが唯一のプログラミングによりらしいです。

例えば:

X + Y = 9、X * Y = 15?そのような整数x及びy

4 + 1 * 4 = 4 = 5,1、従って、4,4に1に等しい整数2で、最大5まで追加

7 +( - 6)= - 1.7 *( - 8)= - 56、従って、乗算、-1に7に等しい整数2を加算し、-8 -56に

入力

入力データがN、Mのペアの整数である(-10000 <N、M <10000)の両方が0、入力端である場合、整数の和と積を表します。

出力

のみ各n及びmのために、出力「はい」または「いいえ」は、明らかにライン上のそのような整数がまだ存在しません。

サンプル入力

9 15

5 4

1 -56

0 0

サンプル出力

番号

はい

はい

        (1)プログラミングのアイデア。

          提供されるX + Y = N X * Y = M、 *利用可能なX(NX)X M = 2 -NX + m = 0の

         このXを解決することが次方程式には不明です。

         = N次DLT 2 -4m、

         DLT <0は、式が本当のルーツ、Xを持っていないとyが整数である場合は可能性が低いので、「いいえ」の出力。

        0 == DLT場合、したがって "はい" の出力をX = Yを取得= N / 2、xおよびyは整数であり、そしてすることができます。

        (二つの実根は必ずしも整数ではない)式X1およびX2の二つの実根を得るために、二次方程式の根の式に従って、x及びyに丸められ、DLT> 0の場合。X + Yを満足== Nであり、X * Y == Mの場合は、出力が "はい"、そうでない場合、 "いいえ" を出力します。

    (2)ソース。

書式#include <stdio.hに>

書式#include <math.h>の

メインint型()

{

    整数N、M、DLT、X、Y。

    一方、(1)

    {

        scanf関数( "%D%D"、&N、&M)。

        IF(N == 0 && M == 0)ブレーク。

        DLT = N * N-4 * M。

        (DLT <0)の場合

            printf( "いいえ\ N");

        それ以外の場合(DLT == 0)

            printf( "はい\ N");

        他

        {

            X =(N +(INT)SQRT(1.0 * DLT))/ 2。

            Y =(N-(INT)SQRT(1.0 * DLT))/ 2。

            IF(X + Y == N && X * Y == M)

                printf( "はい\ N");

            他

                printf( "いいえ\ N");

        }

    }

    0を返します。

}

 

チェスボード上の1-3の距離

        北POJを選択したタイトル(http://poj.org/problem?id=1657)

説明

チェスボードは、グリッドの中央に、ピースを黒と白の8×8の市松れます。下図のように:

 

次のように王は、車の後に、ルールを行くために子供のようなものです:

王:水平方向は、ストレート、斜めに歩くことができますが、すべてのステップの限界セルを歩きます。

後:水平、ストレート、行くように傾斜している、ステップあたりの細胞の数は限定されるものではありません。

車:水平、垂直方向の全ては、細胞の数、行くことができる斜めに移動することはできません、ありません。

同様に:あなたが唯一のセルの数、斜めに移動することができません。

車の後、先に必要な手順の最小数として開始位置から行った、開始位置と目標位置算出王を与え、プログラムを書きます。

入力

最初の行は、テストデータTの組の数である(0 <= T <= 20)。以下、第二目標位置であり、テストデータの各セットのための行は、ボード上の2つの位置を含む各セットは、最初の開始位置です。番号「1」〜「8」から、「」から「H」の文字の形で「英数字」 - 位置で表されます

出力

車の後、テストデータに必要なステップの最小数、入出力王の各セットが挙げられます。あなたが到達できない場合、それは「Infの」を出力します。

サンプル入力

2

A1 C3

F5 F8

サンプル出力

2 1 2 1

3 1 1 Infに

        (1)プログラミングのアイデア。

        ステップ数が開始位置から終了位置に到達するために必要に応じて、それぞれ、基板上の開始位置と終了位置を指定されたタイトルは、車の後、王に決定されます。

        まず第一に、王は、車の後に、互いに独立して、それを検討しています。車の後WANG、機能、ステップの数のようなルールを歩いて、最初から最後まで、それらを起動します。

        位置と水平方向の端開始位置までの距離をx、その垂直方向の距離をyであると仮定する。

        歩行王ルールは、それが必要なステップの数が最小(X、Y)+ ABS(XY)であるので、直線、各ステップで制限下、グリッドランプダウン、水平であってもよいです。即ちX、プラスXおよびY Yより小さい絶対値の和との差。

        必要なステップの数が1であるので、ルールに従って歩いた後、それは、水平、ストレート、ランプダウン、ステップ当たりのセルの数は限定されるものではないとすることができ、xは等しくないYを行い((xはyに等しいか、またはX 0に等しいか、またはyが0に等しい)又は2 )。

        水平、垂直ダウンすることができる車両の走行ルールが、斜めのセルの数が限られて移動できない、必要なステップの数は、1(xまたはyが0に等しい)であるか、または2(xおよびyは0に等しくありません)。

        ルールは歩くように持っている、それが斜めに移動することができ、細胞の数は限定されるものではありません。基板上の格子点は、2つのカテゴリに分けることができ、最初のカテゴリは、横軸と縦軸との間の差が奇数であるが、第二の偶数の水平および垂直座標の差であることです。象のための水平および垂直座標は増加または絶対値の減少が等しいので、すべてのステップは、横軸及び旅行の縦のパリティとの差がいずれの場合にも変わらないこと、斜めに移動することができます。したがって、上記第1の点と第2の点状型は、互いに到達できません。それは、それぞれの二点に属し始点と終点と判断された場合、それらは、多数のステップの結論を必要との間で、描画することができます。それらは終点から出発点として点の同じクラスに属する場合は1に移動する必要がある(xの絶対値がYの絶対値に等しい)又は2(xの絶対値がYの絶対値に等しくありません)。

       (2)ソース。

書式#include <stdio.hに>

書式#include <math.h>の

メインint型()

{

    int型のn;

    チャー開始[5]、末端[5]; //開始し、開始と終了位置を有する端部が片記憶されています

    INT X、Y。     

    scanf関数( "%のD"、&N);

    しばらく(N--)

       {

        scanf関数( "%S%S"、終了を開始します)。

        X = ABS([0]開始 - 終了[0])。

        Y = ABSが(開始[1] - エンド[1])。

        もし(x == 0 && Y == 0)

            printf( "0 0 0 0 \ n"); //同じ開始および終了位置は、すべての部分がなくなって0ステップであります

        他の{

            (X <Y)のprintf( "%d個"、Y)であれば、王のステップの数//

            他のprintf( "%d個"、x)は、

            もし(x == yの|| X == 0 || Y == 0)のprintf( "1")の後の工程の数//

            他のprintf( "2");

            (x == 0 || Y == 0)のprintf( "1")であれば、車両のステップの数//

            他のprintf(」2" );

            //ステップ数として;(!ABS(X-Y)%2 = 0)のprintf( "Infを\ N")の場合 

            そうであれば(x == y)とのprintf( "1つの\ n");

            他のprintf( "2 \ N");

        }

    }

      0を返します。

}

おすすめ

転載: www.cnblogs.com/cs-whut/p/11839502.html