【问题标题】:Find first digit of a number using ONLY integer operations仅使用整数运算查找数字的第一位
【发布时间】:2018-09-26 14:25:49
【问题描述】:

我不明白如何解决老师给我的问题。

给定一个数字 N (0 第一个位。

例如:

input: 100
result: 1

input: 46
result: 4

input: 3
result: 3

一开始看起来很容易,但是(正如老师所说)应该使用ONLY整数数据类型(换句话说,使用+-*/% 运算符)。甚至可以这样做吗?

如果不使用 log10、条件、“while”循环或字符串转换之类的东西,我只是无法实现如何从 可变长度 数字中提取第一个数字。

【问题讨论】:

  • 是否必须不使用循环?
  • 在给定的范围内(0 <= N <= 100) 可以使用两个if,并且在任何范围内都可以使用循环。 (对不起,因为是作业,没有真正的解决方案。)
  • 一个循环不会改变数据类型,你的教授希望你避免的是 n.ToString()[0]
  • 我开始认为这个问题不应该出现在我们上一课学习的主题“整数”中,并且由于缺乏关注或smth而到达那里:(
  • @PhantomLobster 只需将其替换为 if/else 然后

标签: c# math


【解决方案1】:

没有任何条件:

int H= N / 100;       // Hundreds digit
int T= (N / 10) % 10; // Tens digit
int U= N % 10;        // Units digit

int h= H;                      // Hundreds flag
int t= (T + 9) / 10 * (1 - h); // Tens flag
int u= (1 - t) * (1 - h);      // Units flag

int Answer= u * U + t * T + h * H; // Combination

【讨论】:

    【解决方案2】:

    编辑:现在测试 0 和 100:

    var result = n / 10 * (1 - n / 100) + n / 100 + (109 - n) / 100 * n;
    

    它是如何工作的:

    n | n / 10 * (1 - n / 100) | n / 100 | (109 - n) / 100 * n -------------------------------------------------- --------------- 10 - 99 | 1 - 9 | 0 | 0 -------------------------------------------------- --------------- 100 | 0 | 1 | 0 -------------------------------------------------- --------------- 0 - 9 | 0 | 0 | 0 - 9

    【讨论】:

    • N = 0 怎么样?
    • 感谢您的帮助!我想我会坚持这个解决方案,因为它对我来说看起来比@YvesDaoust 的选项复杂一点:)
    【解决方案3】:

    使用 while 循环,并不断将输入数字除以 10,只要我们从 大于或等于 10 的值开始。当修改后的输入小于 10 , 那么这意味着我们已经去掉了右边的所有数字,除了“第一个”数字。

    int input = 100;
    
    while (input >= 10)
    {
        input /= 10;
    }
    
    Console.WriteLine("First digit is: {0}", input);
    

    Demo

    【讨论】:

    • 对不起,我不允许在这个作业中使用循环、条件等。只有+-*/%。我不确定这是否可能:(
    • @PhantomLobster 您可以改用递归,它不会涉及任何 显式 循环。查看其他一些答案。
    【解决方案4】:

    这是一个非通用响应,仅在域有限时才有效。这个想法是返回所有数字(百位、十位和一个)一起平滑。” 关于特定数字范围的一些想法:

    100 很容易,因为十和一的单位都是零。没有其他三位数字,这很好,因为任何非零位或十位的数字都会导致以下问题。

    所有小于 100 的数字都可以在响应中包含百位数字,因为它始终为零。

    10 的任何倍数都很简单,只需包括每百位的十位和一个的值,因为其他数字为零。

    棘手的部分是一个人的位置。如果应该返回更大的数字,则需要有一种方法来“取消”这个值。例如 87,我们想要 8 但想取消 7。

    这就引出了这个想法

    (ten - 9)*(ten - 8)*(ten - 7)*(ten - 6)*(ten - 5)*(ten - 4)*(ten - 3)*(ten - 2)*(ten - 1)
    

    发生的情况是,只要十位非零,上述结果就会为零。因此,当十位非零时,我们可以将个位乘以这个以将个位清零。但是,当十位为零时,就会出现问题。在这种情况下,我们相差 9 倍! (九阶乘 = 362880)和错误的符号。这就是为什么包含一个额外的减号,并在十位为零时除以 362880 得到正确答案。

    public int GetFirstDigit(int n)
    {
        var hundred = (n % 1000) / 100;
        var ten = (n % 100) / 10;
        var one = n % 10;
    
        return hundred + ten + one*
        (
        -(ten - 9)*(ten - 8)*(ten - 7)*(ten - 6)*(ten - 5)*(ten - 4)*(ten - 3)*(ten - 2)*(ten - 1)
        ) / 362880
        ;
    }
    

    检查

    Enumerable.Range(0, 101).ToList().ForEach(x => Console.WriteLine(x + ": " + GetFirstDigit(x)));
    

    【讨论】:

      【解决方案5】:

      我试图解决这个案子但没有成功, 如果 N 为 1 - 100,我只能找到第一个数字。 这是我的源代码。希望能帮助到你 https://dotnetfiddle.net/6XyOfd

      【讨论】:

      • @Pretasoc 感谢您的审查,是的,我的错,它只适用于 10 - 99
      【解决方案6】:
      static int Result(int input)
      {
          return input/100 + (input%100/input)*input/10 + (input%10/input)*input;
      }
      
      • input/100 将返回 1 当且仅当 input 等于 100,否则为 0
      • 当且仅当input < 100(input%100/input) 将返回 1,否则返回 0
        • 如果input小于10,input/10将为0
      • (input%10/input) 将返回 1 当且仅当 input < 10,否则为 0

      注意

      如果input == 0 会中断,请参阅@quanik's answer 处理 0。

      但是,它适用于 1-999。

      【讨论】:

      • @quanik 我实际上在最后一部分中遇到了困难,直到我意识到这会起作用
      • @YvesDaoust 我意识到了这一点,并在您发表评论前 33 秒编辑了我的答案
      【解决方案7】:
      if (N < 10)
        Output(N)
      else if (N < 100)
        Output(N / 10)
      else
        Output(1)
      

      【讨论】:

      • OP 禁止的事实条件怎么办?
      • @Rafalon:最初的帖子中并不清楚。从那以后,我添加了一个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多