仅使用整数运算来查找数字的第一位

时间:2018-09-25 13:28:11

标签: c# math

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

  

给出数字N(0 <= N <= 100),找到其第一个数字。

例如:

input: 100
result: 1

input: 46
result: 4

input: 3
result: 3

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

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

7 个答案:

答案 0 :(得分:10)

没有任何条件:

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

答案 1 :(得分:5)

编辑:现在已测试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

答案 2 :(得分:2)

使用while循环,并保持输入数字除以10,只要我们开始的值是更大等于或等于10。当修改的输入小于10时,则表示我们已经除去了除“第一个”数字之外的所有数字。

int input = 100;

while (input >= 10)
{
    input /= 10;
}

Console.WriteLine("First digit is: {0}", input);

https://docs.microsoft.com/en-us/sql/relational-databases/xml/xml-data-type-and-columns-sql-server?view=sql-server-2017

答案 3 :(得分:1)

这是一个非通用的响应,仅适用于域受限的情况。这样做的目的是返回所有被混淆在一起的数字(百位,十位和一个)。”对特定范围的数字的一些思考:

100很容易,因为十和一的单位均为零。没有其他三位数,这是很好的,因为任何位置不为零或十的东西都会在下面引起问题。

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

10的倍数很容易,只需加上百分之十和一个值,因为其他数字为零。

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

这导致了想法

0.001

发生的事情是,每当十位不为零时,上面的值将为零。因此,当十位数不为零时,我们可以将其位数乘以零。但是,当十位为零时会出现问题。在这种情况下,我们相差9倍! (9阶乘= 362880)和错误的符号。这就是为什么要包含一个额外的减号,并在十位为零时除以362880以获得正确答案的原因。

0.024

检查

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

答案 4 :(得分:0)

static int Result(int input)
{
    return input/100 + (input%100/input)*input/10 + (input%10/input)*input;
}
  • input/100仅在input等于100时返回1,否则返回0
  • (input%100/input)将仅在input < 100时返回1,否则返回0
    • 如果input小于10,则input/10将为0
  • (input%10/input)仅在input < 10时返回1,否则返回0

警告

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

但是,它将适用于1-999。

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

if (N < 10)
  Output(N)
else if (N < 100)
  Output(N / 10)
else
  Output(1)