2016-12-15 10 views
-1

Iは、次のデータを持っている: Y-N-Y-Y-N-N-N-Y-N-Y-Y-N-N-N-Y-N-Y-Y-N-N-N ...ループから必要な要素を計算するには?

I 5 "x" を有する: Y-N-Y-Y-N-N-N これはのような、無限に繰り返されます。 「x」だけが「y」で付いています。私は上記のループ上のxを配布する場合 意味では、それは次のようになります。 y-n-y-y-n-n-n-y-n-y-y-n-n-n x---x-x-----x-x

私は私は全体の5×を広めるために使用する必要がどのように多くのループの要素のカウントにしたい、との答えは10です。

数式で計算するにはどうすればよいですか?

+0

質問を適切に説明してください。 – Razin

答えて

0

あなたが言っていることは、5Xを得るために無限リストの最初の10個の要素を処理する必要があると仮定します。

y-n-y-y-n-n-n-y-n-y-y-n-n-n-y-n-y-y-n-n-n... 
x-_-x-x-_-_-_-x-_-x 
       ^
        L____ 10 elements read from the infinite list to place the 5 x's. 

私はまた、あなたの質問であることを推測:あなたはそれらの5 Xを一致させるために、無限のリストに処理する必要がある要素の数が何であるか5点のX、の入力与えられました。

次の擬似コードのようなループでそれを計算することができます:

iElementsMatchedCounter = 0 
iXsMatchedCounter = 0 
iXLimit = 5 
strElement = "" 

if (InfiniteList.IsEmpty() == false) 
{ 
    do 
    { 
     strElement = InfiniteList.ReadNextElement() 

     if (strElement == "y") 
     { 
      iXsMatchedCounter += 1 
     } 

     iElementsMatchedCounter += 1 

    } while ((InfiniteList.IsEndReached() == false) AND (iXsMatchedCounter < iXLimit)) 
} 

if (iXsMatchedCounter = iXLimit) 
    then Print(iElementsMatchedCounter) 
    else Print("End of list reached before all X's were matched!") 

上記の方法の欠点は、あなたが実際には好ましいことではないかもしれない無限のリストを、読んでいるということです。

あなたのリストが同じ要素y-n-y-y-n-n-nの無限に繰り返されるシーケンスであることを考えれば、リスト全体をループする必要はなく、サブリストy-n-y-y-n-n-nで操作するだけです。

を考えると、あなたの出発入力:中

  • iNumberOfXs = 5(あなたは5 Xが一致する必要が)
  • iNumberOfYsInSubList = 3 (あなたが持っている3イース以下のアルゴリズムがどのように説明しますサブリスト、総リストは無限に繰り返される)
  • iLengthOfSubList = 7(あなたはサブリスト内の要素7 ynyynnnを持っている)

それから計算された中間結果を有する:

  • iQuotient
  • iPartialLengthOfList
  • iPendingXs
  • iPendingLengthOfList
  • iResult

folloを翼の手順では、結果を与える必要があります:

  1. デバイドにiNumberOfXsにiNumberOfYsInSubListで。ここで、これは私たちに5/3 = 1.666 ....
  2. を与えます。その結果の残りの部分(0.666 ...)を捨てて、のicootientとして1を残します。これは、反復処理が必要な完全なサブリストの数です。
  3. この商1にiLengthOfSubListを掛けて、1 * 7 = 7をiPartialLengthOfListとします。これは結果の部分和であり、あなたが反復する完全なサブリストの中の要素の数です。
  4. iNumberOfYsInSubListと商を乗算し、iNumberOfXs、すなわちiNumberOfXsからこの製品を減算 - (iQuotient * iNumberOfYsInSubList)= 5 - (1 * 3)= 2.保存、この値2 としてiPendingXs、そのは、まだ一致していないXの数です。
  5. iPendingXsが常に未満iLengthOfSubList(すなわち、それはモジュロである、iPendingXs = iNumberOfXs MODULO iNumberOfYsInSubList)されることに注意してください。
  6. y-n-y-y-n-n-nのサブリストに2つのX(すなわち、上記の計算での値がiPendingXsの値)を一致させるという小さな問題があります。(iPendingLengthOfListとしてカウント)
  7. 一致する保留中のアイテムは、次のとおり iPendingXsに等しい
    • iPendingXsiPendingXs + 1に等しい0又は1
    • あればそうでない場合(すなわち、場合iPendingXsが1より大きい)
    • iPendingLengthOfList = 3、iPendingXsはあなたのサブ場合iPendingLengthOfList(3)は、一般に、即ち10

、答えは1

  • iPartialLengthOfList(7)の和とより大きいリストynyynnnが事前定義されていない場合、手順6でルールをハードコーディングすることはできませんが、上記の擬似コードと同様に、サブリストを1回ループしてYと要素を数える必要があります。

    実際のコードでは、整数除算とモジュロ演算を使用して、ステップ2と4の操作をすばやく実行できます。

    iQuotient = iNumberOfXs/iNumberOfYsInSubList  // COMMENT: here integer division automatically drops the remainder 
    iPartialLengthOfList = iQuotient * iLengthOfSubList 
    
    iPendingXs = iNumberOfXs - (iQuotient * iNumberOfYsInSubList) 
    // COMMENT: can use modulo arithmetic like the following to calculate iPendingXs 
    // iPendingXs = iNumberOfXs % iNumberOfYsInSubList 
    
    // The following IF statement assumes the sub-list to be y-n-y-y-n-n-n 
    if (iPendingXs > 1) 
        then iPendingLengthOfList = iPendingXs + 1 
        else iPendingLengthOfList = iPendingXs 
    
    iResult = iPartialLengthOfList + iPendingLengthOfList 
    
  • 関連する問題