2016-05-05 7 views
1

私はかなりの間これに固執しています。私のプログラムでやりたいこと:2つのリストでの操作<>

2つのリストがあります。数量と価格のいずれか。私はシリアル(例:quantity [i] * price [i])に従って2つを乗算し、乗算結果を加算して特定の数を得たいと思って、それらを追加して100を得るが、101.123とか達成したいのは、最初の価格番号(私は数量に触れることができません)に0.001を加え、それが私が望む答えと一致するかどうかを確認することです。最初の番号から番号を取得できない場合は、5を超えて追加できません。2番目の番号に移動し、最初の番号から前の番号に移動します。誰でも?ここで私が得たところです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Ultimateproject_beginner_ { 
    class Program { 
     static List<decimal> QuantityList() { 
      Console.WriteLine("Quantity"); 
      Console.WriteLine(); 
      List<decimal> quantityList = new List<decimal>(); 
      for (;;) { 
       string stringQuantityNumber = Console.ReadLine(); 
       decimal quantityNumber = 0M; 
       if (stringQuantityNumber == "done") { 
        break; 
       } else { 
        if (decimal.TryParse(stringQuantityNumber, out quantityNumber)) { 
         quantityList.Add(quantityNumber); 
        } 
       } 
      }//end of for loop 
      return quantityList; 
     } 

     static List<decimal> PriceList() { 
      Console.WriteLine("Price"); 
      List<decimal> priceList = new List<decimal>(); 
      for (;;) { 
       string stringPriceNumber = Console.ReadLine(); 
       decimal priceNumber = 0M; 
       if (stringPriceNumber == "done") { 
        break; 
       } else { 
        if (decimal.TryParse(stringPriceNumber, out priceNumber)) { 
         priceList.Add(priceNumber); 

        } 
       } 
      }//end of for loop 
      return priceList; 
     } 

     static void Main(string[] args) { 
      List<decimal> quantityList = QuantityList(); 
      List<decimal> priceList = PriceList(); 
      decimal destination = 101.123M; 
      decimal sum = 0M; 
      for (int i = 0; i < quantityList.Count; i++) { 
       decimal product = priceList[i] * quantityList[i]; 
       sum = sum + product; 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 

私はそれがループのために、いくつかのネストされたで動作させることを試みたが、私は他のすべてのものと新しい値を乗算しなければならないところ、私は動けなくなります。

私は何を得る:101.123はどのように:私が欲しいもの100、0.001を追加することによって、価格表と合計がこれに対処する101.123

+0

あなたのロジックを理解できませんでした。なぜあなたは '101.123'の代わりに' 100 'という値を計算したいのですか?税金?これはCodeReviewのウェブサイトに属しています。とにかく、サンプル入力、希望する出力、現在の出力を提供する必要があるかもしれません。 –

+1

ここで何をしようとしているのか分かりません。ここで役立つものは次のとおりです。 10個の数量と10個の価格のリストを例に挙げて、この問題を手で解決する方法を教えてください*。問題を手で解決する方法を理解できたら、その問題をプログラムに翻訳する手助けをすることができます。 –

+6

@FirstStep:CodeReviewは動作するコード用です。このコードは機能しません。 –

答えて

1

一つのアプローチは、第一の経路上の総を計算しているかどうかをチェックし、その後、姿をあなたが必要とする追加をいくつ出してから、調整を実行します。追加できる最大値は、発注されたすべてのアイテムの合計数量の0.05倍に制限されているため、目的のターゲットに到達できない可能性があることに注意してください。合計額が100ドルの場合は101.23ドルが必要ですが、注文アイテムは10アイテムしかありません。アイテムあたり0.04ドルで得ることのできる最高額は100.50ドルです。

あなたはLINQを使用して合計を計算することができます

var total = quantityList.Zip(priceList, (q, p) => q*p).Sum(); 

計算に割り当てられるように残りの値を、そして個々の行を通過し、ゼロにremaining滴まで調整を行います。

var remaining = destination - total; 
for (int i = 0; remaining > 0 && i < quantityList.Count; i++) { 
    var quantity = quantityList[i]; 
    // Avoid crashes on zero quantity 
    if (quantity == 0) { 
     continue; 
    } 
    // We cannot assign more than quantity * 0.05 
    var toAssign = Math.Min(remaining, quantity * 0.05); 
    remaining -= toAssign; 
    // Split the amount being assigned among the items 
    priceList[i] += toAssign/quantity; 
} 
if (remaining > 0) { 
    Console.WriteLine("Unable to distribute {0:C}", remaining); 
} 

注:parallel listsではなく、数量/価格のペアを表すクラスを作成することをお勧めします。

+0

私はそれをあなたに少し明確にしようとします:すべての数字に0.001を追加するのではなく、priceListの最初の項目を増分して、それが私の目的地と一致するかどうかをチェックします。私は0でそれを増やすでしょう。001 5000回私は5000時間で結果を得ることができない場合、私は次のものに移動したい。私はネストされたforループがそれを行うことができると思います。 –

+2

@RezaTaiburネストされたループは必要ありません。0.001を使う必要はありません。ターゲットを持っている場合は、単に数量で割って、自動的にインクリメントする必要がある回数を取得することができます。 – dasblinkenlight

+1

@RezaTaibur例を考えてみましょう:あなたの合計が$ 1で、$ 1.01が必要で、$ 0.50の二つの商品のリストがあれば、 $ 0.501、$ 0.502、$ 0.503、$ 0.504を5回反復して、$ 0.505の正解に達するまで、または$ 0.01を2つの数で分けて、正しい結果をすぐに得ることができます。 – dasblinkenlight

0

合計が計算されたら、それを宛先と比較します。 sum <宛先の場合は、count =(destination-sum)/ 0.001として必要な0.001増分の数を計算します。これが5未満の場合は、最初の価格にこれを多く追加し、そうでない場合は5つを追加して(0.005)、カウントから5を引きます。 count> 0の場合は、2番目の価格などの処理を繰り返します.countがpricelist.Count * 5より大きい場合は、目的地価格に到達できません。

関連する問題