2011-11-09 21 views
3

我需要創建將生成x和y(例如,x = 1,Y = 20)之間的2對隨機數的函數,其加入將不涉及重組/或攜帶時subracted將不涉及借貸其中當。如何確定是否加入2號將涉及regourping /攜帶或subracting 2號將涉及借款?

例如,

18 + 1 = good 
14 + 5 = good 
18-7 = good 
29 - 8 = good 

15 + 6 = bad 
6 + 7 = bad 
21 - 3 = bad 
36 - 8 = bad etc. 

我想創建一個簡單的工作表生成,將產生使用上述要求的樣品問題。

我想我可以一直數轉換爲字符串,獲得每個2號的最右邊的數字,將它們轉換回到整數,並測試一個比另一個更大。重複所有的數字。唯一的事情是,這是非常醜陋的(閱讀效率低下)。我相信有更好的辦法。任何人有任何建議?由於

+0

這是一個非常「基數10」的問題... –

+0

你可以擴展嗎?我不明白。 – Ashaneil

+0

嗯,問題不是關於數字,而是關於數字的基數10 *表示*。比方說,答案可能會是不同的基數2或基數16。另一方面,這給你一個線索,數字庫是算法中的關鍵成分。 –

回答

2
using System; 

class Sample { 
    static void Main() { 
     var rnd = new Random(); 
     var x = 1; 
     var y = 20; 
     var a = rnd.Next(x, y); 
     var b = rnd.Next(x, y); 
     var op = '+'; 
     Console.WriteLine("{0} {2} {1} = {3}", a, b, op , isValid(a, b, op)? "good":"bad"); 
     op = '-'; 
     Console.WriteLine("{0} {2} {1} = {3}", a, b, op , isValid(a, b, op)? "good":"bad"); 
    } 
    static bool isValid(int x, int y, char op){ 
     int a = x % 10; 
     int b = y % 10; 
     switch (op){ 
     case '+': 
      return a + b < 10; 
     case '-': 
      return x >= y && a - b >= 0; 
     default: 
      throw new Exception(String.Format("unknown operator '{0}'", op)); 
     } 
    } 
} 
+0

請注意,此代碼僅適用於小於50的數字。(您可以通過在''+''情況下爲'x + y <100'添加一個額外的檢查,從而使其最多可以工作到99。爲更大的數字工作,請參閱下面的其他答案(包括我的)。 –

2

分手的數字成數字確實正是你需要做什麼。不要緊,你是否做到這一點的算術運算符(除法和模量10)或通過轉換成數字串,但從根本上說你的問題恰恰是對數字的個別數字。

  • 對於減法X −ÿ,不需要借位當且僅當沒有的位數ý比在X相應的數字越大。

  • 對於加成X + Y,不會有攜帶當且僅當每對相應的數字的總和是小於10。

這裏的一些僞C#,用於檢查這些條件:

bool CanSubtractWithoutBorrow (uint x, uint y) { 
    while (y > 0) { 
     if ((x % 10) < (y % 10)) return False; 
     x /= 10; y /= 10; 
    } 
    return True; 
} 

bool CanAddWithoutCarry (uint x, uint y) { 
    while (x > 0 && y > 0) { 
     if ((x % 10) + (y % 10) >= 10) return False; 
     x /= 10; y /= 10; 
    } 
    return True; 
} 
4

一次生成一位數字。 e.g

a1 = rand(9) 
a2 = rand(9 - a1) 

b1 = rand(9) 
b2 = rand(9 - b1) 

x = b1*10 + a1 
y = b2*10 + a2 

從你知道x+y將不涉及任何隨身攜帶的建設,因爲a1+a2 <= 9b1 + b2 <= 9

你可以做減法類似。

如果你想限制總體範圍爲[1..20]而不是[1..99],只是調整的最左邊的數字範圍:

b1 = rand(1) 
b2 = rand(1 - b1) 
0

你需要看看每一對數字輪流看看是否加減它們都涉及到進位。

您可以通過取模值10,X%10送最右邊的數字,你可以通過10

沒有字符串轉換是必要將刪除最右邊的數字。