2012-12-27 95 views
-5

我在這裏有點困惑,雖然我確信答案很簡單。我想爲不同的數字添加不同的值,但這怎麼能簡單地實現呢?給數字賦予不同的值

例如:1 = 10,3 = 20,5 = 30.如果用戶輸入數字4,答案將是60.因爲2沒有任何具體的值,所以它也應該是10.數字2也是需要10作爲一個值,因爲它在1之後,並沒有得到新的價值。數值在3到20之間變化,從那時起每個數字的值爲20,直到一個新值被分配給一個更高的數字。然後4號必須是20了,因爲值還不改變,數量5需要獲得50

又如值:

Numers entered by user: 10 

    Values: 
    1 = 10 
    5 = 20 
    8 = 30 

    In this case, the values of all the 10 numbers should be: 
    1 = 10 
    2 = 10 
    3 = 10 
    4 = 10 
    5 = 20 
    6 = 20 
    7 = 20 
    8 = 20 
    9 = 30 
    10 = 30 

所以答案應該是:180 (所有組合值)。

+2

堅持... 4應該被重新映射到60,但如果它後來到三.. ..?而且因爲它「沒有改變」_這是什麼價值?我已經提供了一個答案,但我現在不確定我是否正確理解你的問題。你實際上在問什麼有點不清楚 - 你能否提供一個更好的描述,以及你期望的更多的例子? – Kjartan

+0

@Kjartan我已經更新了開幕帖子,希望現在更清楚一點。 – user1931912

回答

1

您的示例包含棘手的錯誤:而不是8 = 20應該是8 = 30所以實際答案是190

以下是根據您的示例計算總計的代碼。希望它有幫助

// Following lines should be replaced with actual input method 
int TotalNumber = 10; 
List<Tuple<int, int>> CheckPoints = new List<Tuple<int, int>>(); 

CheckPoints.Add(Tuple.Create(1, 10)); 
CheckPoints.Add(Tuple.Create(5, 20)); 
CheckPoints.Add(Tuple.Create(8, 30)); 


int NumberTillCount = 10;//determines point till which calculation should proceed 

int result = 0; 
Tuple<int, int> CurrentCheckPoint = new Tuple<int,int>(0,0); 

//Loop checks if new CheckPoint is encountered and writes it in temp variable 'CurrentCheckPoint' 
for (int i = 1; i <= NumberTillCount; i++) 
{ 
    CurrentCheckPoint = CheckPoints.FindIndex(x=>x.Item1 == i) != -1 ? CheckPoints.Find(x=>x.Item1 == i) : CurrentCheckPoint; 
    result += CurrentCheckPoint.Item2; 
} 
+0

這是我正在尋找。非常感謝你!我打算再研究一下。 :) – user1931912

3

我認爲你可以使用Dictionary<int, int>這個,所以key將是一個用戶輸入,一個value - 相關的「響應」。

IDictionary<int, int> map = new Dictionary<int, int>(); 
map.Add(1, 10); 
map.Add(3, 20); 


public int GetResponseForUserInput(int input) 
{ 
    int response = -1; 
    if (map.ContainsKey(input)) 
    { 
     response = map[input]; 
    } 

    return response; 
} 
+0

我測試了這個腳本,但它不起作用。所有有值的數字都是-1。 – user1931912

+0

@ user1931912它正是如何工作的。您必須爲每個**所需的輸入添加'map.Add(UserInputNumber,ReturnedValue);'** – Nogard

+0

@Nogard您告訴我必須爲每個想要使用的數字編寫10.000個map.Add語句?數字2也需要10作爲一個值,因爲它在1之後,並且沒有獲得新的值。數值在3到20之間變化,從那時起每個數字的值爲20,直到一個新值被分配給一個更高的數字。 – user1931912

0

你可以做最簡單的事情可能是剛剛實施的方法以一個開關結構,像這樣:

public int getNumber(int inputNr) 
{ 
    var returnNr = 1; 

    switch (inputNr) 
    { 
     case 1: 
      returnNr = 10; 
      break; 
     case 3: 
      returnNr = 30; 
      break; 
     case 4: 
      returnNr = 60; 
      break; 
     default: 
      // Probably not needed, as default returnNr is 1. 
      break; 
    } 

    return returnNr; 
} 

編輯:關於第二個想法,這是更簡單:

// Place the values in positions according to when you want them as results: 
int[] numbers = {1, 10, 1, 30, 60}; 

public int getNumber(int inputNr){ 
    return numbers.GetValue(inputNr); // Return the value at position "inputNr". 
} 
+0

'switch'解決方案有一些缺點:1)所有相關性都是硬編碼的,不能在運行時更改2)可能縮放到20個以上的選項會使其非常龐大且難以維護 – Nogard

+0

結果與上面的海報相同。數字2也需要10作爲一個值,因爲它在1之後,並且沒有獲得新的值。數值在3到20之間變化,從那時起每個數字的值爲20,直到一個新值被分配給一個更高的數字。 – user1931912

+0

我完全瞭解這裏的缺點,但這是一個相當簡單的問題,所以它需要一個簡單的解決方案,它基於一組假設的輸入數字來表示一個簡單的原則。對於更大的系統來說,更好的解決方案可能是使用數據庫表或類似的東西來映射輸入和輸出數字,但這可能略微超出此範圍;) – Kjartan