【问题标题】:How can we get range of number我们如何获得数字范围
【发布时间】:2013-08-06 14:49:56
【问题描述】:

我想根据C#中的用户输入,制作一个范围数(例如:1-10)。 我有一个 asp 文本框,按钮。用户可以在文本框中输入小于 10,000 的数字。 我想,当用户点击按钮时,用户得到他输入值的范围。

例如 - 如果用户在文本框中输入"35",他会得到"Number Range: (31-40)"

但是,我有一些特殊条件来制作范围 -

如果输入介于 -

之间的数字

a) 1 到 50 范围的长度是 10 - 例如输入数字是 -49,范围是 (41-50)

b) 51 到 100 范围的长度是 25 - 例如输入数字是 -78,范围是 (76-100)

c) 101 到 200 范围的长度是 50 - 例如输入数字是 -135,范围是 (101-150)

d) 201 到 400 范围的长度是 100 - 例如输入数字是 -245,范围是 (201-300)

等等…………

我为此使用了Switch Case,但是我没有成功创建正确的逻辑来获得此功能。

感谢您的帮助...任何帮助将不胜感激。

【问题讨论】:

    标签: c# arrays switch-statement range


    【解决方案1】:

    一种简单的方法是使用 if 和 else-if 之类的:

    if(number < 0)
    {
    // number below zero
    }
    else if(number < 10)
    {
    // range 0 - 9
    }
    else if(number < 40)
    {
    // range 10 - 39
    }
    else if(number < 200)
    {
    // range 40 - 199
    }
    else if(number < 1000)
    {
    // range 200 - 999
    }
    else
    {
    // range 1000 -
    }
    

    【讨论】:

    • 我认为这不是他想要的输出/逻辑
    • 是的,这取决于如何定义范围,以及它们是否恒定。此外,如果范围需要进一步的代码或只是返回它是哪个
    【解决方案2】:

    试试这个,没有任何 if/else/switch 的工作,只是很好的旧数学:

    int x = yourNumber;
    int maxRange = 50;
    while (x > maxRange) maxRange *= 2;
    int range = maxRange / 4 / 5 * 5;
    int begin = ((x-1) / range * range) + 1;
    int end = begin + range - 1;
    

    beginend 是你范围的开始和结束,我想你可以自己做。

    【讨论】:

    • @SriramSakthivel 如果您查看问题中的 b),这正是所需的输出。或者你认为它应该返回什么?
    • 您的解决方案会假设最大范围每次翻倍。但是当你使用像 9984 这样的数字时,你会得到9601-12800,而 OP 指定“小于 10,000”
    • @Tseng 他指定输入的数字小于10000。没有指定输出范围。他编写的 4 个示例完全符合我的代码适用的模式。 ofc 范围可能会打破这种模式。但他说“等等……”。因此我的代码遵循这种模式。另外我认为这是某种家庭作业。显然应该有一个像 10000 这样的下限,因为大多数人无法创建我所做的代码,并且必须复制/粘贴很多
    【解决方案3】:

    我想这就是你要找的Enumerable.Range

    int num = 35;    
    if (num <= 50)
    {
        int divisor = 10;
        int quotient = num / divisor;
        var result = Enumerable.Range((quotient * divisor) + 1, divisor).ToArray();
    }
    else if (num <= 100 )
    {
        //I assume you can expand yourself
    }
    

    【讨论】:

    • @Jonesy 你是什么意思?
    • 现在,如果您将 50 案例概括为它自己的功能,您将有一个更好的答案...
    【解决方案4】:

    这是我如何做的一个例子,因为从最初的问题来看,不清楚结果应该是一个字符串、一个数字数组还是其他什么。

    class Program {
        static void Main(string[] args) {
            int[] numbers = { 49, 78, 135, 245, 0, 1, 50, 51, 100, 101, 150, 151, 200, 201, 300, 301, 400};
    
            foreach(var number in numbers) {
                string result = GetRange(number);
                Console.WriteLine(string.Format("Input: {0}\tResult: {1}",number, result));
            }
    
            Console.ReadKey();
        }
    
        private static string GetRange(int number) {
            if(number <= 50) {
                return RangeByQuotient(number, 10);
            } else if(number <= 100) {
                return RangeByQuotient(number, 25);
            } else if(number <= 200) {
                return RangeByQuotient(number, 50);
            } else if(number <= 400) {
                return RangeByQuotient(number, 100);
            }
    
            return "Invalid Range";
        }
        private static string RangeByQuotient(int number, int quotient) {
            var lower = ((number-1) / quotient) * quotient + 1;
            var upper = (((number-1) / quotient)+1) * quotient;
    
            return string.Format("({0}-{1})", lower, upper);
        }
    }
    

    结果

    Input: 49       Result: (41-50)
    Input: 78       Result: (76-100)
    Input: 135      Result: (101-150)
    Input: 245      Result: (201-300)
    Input: 0        Result: (1-10)
    Input: 1        Result: (1-10)
    Input: 50       Result: (41-50)
    Input: 51       Result: (51-75)
    Input: 100      Result: (76-100)
    Input: 101      Result: (101-150)
    Input: 150      Result: (101-150)
    Input: 151      Result: (151-200)
    Input: 200      Result: (151-200)
    Input: 201      Result: (201-300)
    Input: 300      Result: (201-300)
    Input: 301      Result: (301-400)
    Input: 400      Result: (301-400)
    

    更新: 已更新以正确处理边界情况,例如 50、51 等。

    【讨论】:

      【解决方案5】:

      我猜只有101以下的数字是特化的,否则似乎符合特定的公式,一种可能的解决方案如下:

      public static int[] GetRagneOf(int value) {
          var x=value>0?(value-1)/50:0;
      
          var power=Math.Log(x, 2);
          var count=25*(int)Math.Pow(2, power);
          var start=1+25*(int)Math.Pow(2, 1+power);
      
          if(value<101) {
              if(value<76) {
                  if(value<51) {
                      count=10;
                      start=1+value-(value%10);
                  }
              }
              else {
                  start+=count;
              }
          }
      
          return Enumerable.Range(start, count).ToArray();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 2011-11-06
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        相关资源
        最近更新 更多