如何找到每个数字在3中的所有三位数字,并且数字的加法等于数字本身

时间:2018-05-12 04:30:31

标签: c#

如何找到每个数字在3中的所有三位数字,并且数字的加法等于数字本身。

例如:

3 ^ 3 + 7 ^ 3 + 1 ^ 3 = 371

更新

我必须找到100-999之间的所有数字,然后将每个数字分开然后执行三位数操作(数学运算)并检查所有数字是否等于数字本身

数字371满足以下条件:第三个数字的总和等于数字本身

1 个答案:

答案 0 :(得分:6)

<强>答案

你可以使用这样的东西

public static IEnumerable<int> GetDigits(int num)
{
   do { yield return num % 10; } while ((num /= 10) > 0);
}

public static bool SomeWeirdMathsOp(int num)
{
   return num == GetDigits(num).Sum(x => (int)Math.Pow(x, 3));
}

用法

var list = Enumerable.Range(100, 900).Where(SomeWeirdMathsOp);
foreach (var item in list)
    Console.WriteLine(item);

输出

153
370
371
407

Full demo here

基准

只是为了好玩(因为我很讨厌)我决定对每个人的答案进行基准测试

<强>结果

Mode            : Release
Test Framework  : .NET Framework 4.7.1
Benchmarks runs : 100 times (averaged/scale)

Scale : 900
Name      |     Time |    Range | StdDev |    Cycles | Pass
--------------------------------------------------------------
MineTimes | 0.136 ms | 0.016 ms |   0.03 |   456,359 | Yes
Mine      | 0.250 ms | 0.005 ms |   0.05 |   830,104 | Base
Mahsa     | 0.332 ms | 0.008 ms |   0.03 | 1,122,867 | Yes
JohnyL    | 2.135 ms | 0.204 ms |   0.34 | 7,262,956 | Yes

MineTimes是 Enigmativity的版本,它只是手动执行此功能

public static bool SomeWeirdMathsOp(int num)
{
   return num == GetDigits(num).Sum(x => x * x * x);
}

其他资源

yield (C# Reference)

  

在语句中使用yield关键字时,表示该   方法,运算符或获取它的访问器是迭代器。   使用yield来定义迭代器不需要显式   额外的类(保存枚举状态的类,

% Operator (C# Reference)

  

余数运算符(%)在除以后计算余数   第二个操作数。所有数字类型都已预定义   余数运营商。

Enumerable.Sum Method (IEnumerable, Func)

  

计算由其获得的Double值序列的总和   在输入序列的每个元素上调用转换函数。

Math.Pow Method (Double, Double)

  

返回指定数量的指定数字。

Enumerable.Range Method (Int32, Int32)

  

在指定范围内生成一系列整数。