繁体   English   中英

对 C# 中的每个数字进行平方

[英]Squaring every digit in C#

我正在尝试对数字的每个数字进行平方并返回一个 integer 和所有平方值。 例如,如果输入的 integer 是9119 ,则会出现811181 ,因为 9 的平方是 81,1 的平方是 1。我目前的尝试是:

using System;
using System.Collections.Generic; 

public class Kata
{
public static int SquareDigits(int n) {

    String inputNums = n + "";
    String[] digits = inputNums.Split("");
    String outputNums = "";


    foreach (string s in digits) {
      int i = Int32.Parse(s);
      var outputNum =  (i * i);
      outputNums += (outputNum);

    }

    return Int32.Parse(outputNums);

  }
}

但是,我不断收到此错误:

Test Failed
  Expected: 811181
  But was:  83156161

谁能帮我理解我哪里出错了? 我试图将整数转换回字符串,试图让它们连接但不加在一起,但我似乎无法得出正确的值。 我对 C# 还是比较陌生,所以感谢您的帮助 - 谢谢:)

您可以通过仅执行数学运算来避免格式化和解析为字符串。

public static int SquareDigits(int n)
{
    int result = 0;
    int places = 0;

    // loop while n has digits.
    while(n > 0)
    {
        // Get the least significant digit
        int digit = n % 10;

        // Square the digit
        int square = digit * digit; 

        // Add the square to the result the number of places over
        result += (int)Math.Pow(10,places) * square;    

        // Increase the number of places by the size of the square (either 1 digit or 2)
        places += square > 10 ? 2 : 1;  

        // Removed the least significant digit
        n /= 10;
    }

    return result;
}

注意:您可能希望 go 使用long而不是int作为返回类型,以便在遇到溢出之前允许更大的返回类型。 甚至BigInteger来处理所有可能的正int输入。 同样显然,对于任何负数,这都会返回 0。

这不起作用,因为空字符串不是String.Split的有效分隔符。 但是字符串是字符的枚举。 枚举 foreach 循环中的字符:

public static long SquareDigits(int n)
{
    string inputNums = n.ToString();
    string outputNums = "";

    foreach (char c in inputNums) {
        int i = c - '0';
        int outputNum = i * i;
        outputNums += outputNum;
    }
    return Int64.Parse(outputNums);
}

您可以在 C# 中使用char被视为 16 位 integer 类型的事实。 要获得数字的相应数值,请从给定字符中减去字符'0' 例如'5' - '0'给出5 注意(int)'0'是 48(字符'0'的字符代码)和(int)'5'是 53。53 - 48 = 5。

通过使用longSystem.Int64作为 function 的返回类型,我将可能输入的范围扩展到Int32.MaxValue = 2147483647。

这个怎么样?

int num = 9119;
string squared = "";
foreach (var c in num.ToString())
{
    int part = int.Parse(c.ToString());
    int square = part * part;
    squared += square.ToString();
}

int answer = int.Parse(squared);

在您的代码中, String[] digits = inputNums.Split("")不会因为Split("")解析您的字符串。 您正在向拆分 function 发送空字符串。 您可以使用此 function。

public static int SquareDigits(int n)
        {

            char[] digits = n.ToString();
            String result = "";
            foreach (char ch in digits)
            {
                double squared = Math.Pow(Int32.Parse(ch.ToString()),2);
                result += squared.ToString();
            }
            return Int32.Parse(result);
        }

这是最简单的解决方案。

using System;
using System.Collections.Generic; 

public class Kata
{
public static UInt64 SquareDigits(int n) {
    string outputNums = "";
    foreach (char s in n.ToString()) {
        UInt64 i = UInt64.Parse(s.ToString());
        double outputNum =  Math.Pow(i, 2);
        outputNums += Convert.ToString(outputNum);
    }
    return Convert.ToUInt64(outputNums);
}
}

知道一个数字乘以自身总是正数,我们可以使用 UInt64,它是一个 Int64 但只有正数。

试试这个强大的方法:

using System;
using System.Text;

namespace ConsoleApp1
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            var value = 9119;

            if (!TrySquare(value, out var result))
            {
                Console.WriteLine("Failed!");
                return;
            }

            Console.WriteLine(result);
        }

        private static bool TrySquare(int value, out int result)
        {
            result = 0;

            var builder = new StringBuilder();

            var input = value.ToString();

            foreach (var c in input)
            {
                var i = int.Parse(c.ToString());

                builder.Append(i * i);
            }

            // this might fail if number is too large

            return int.TryParse(builder.ToString(), out result);
        }
    }
}

在此处输入图像描述

您应该使用StringBuilder ,而不仅仅是使用字符串(像大多数其他答案一样)。 数字也不必使用intbyte就足够了。 此外,这是一个 function 非常适合作为int的扩展。

public static int SquareDigits(this int number)
{
    StringBuilder builder = new StringBuilder("");
    foreach (char c in number.ToString())
    {
        byte digit = byte.Parse(c.ToString());
        builder.Append(digit * digit);
    }
    return int.Parse(builder.ToString());
}

可以这样调用:

int squared = 9119.SquareDigits(); // 811181

编辑:
如果输入太大,为了避免溢出,您可以使用TryX模式。

bool TrySquareDigits(int number, out int squared)
{
    StringBuilder builder = new StringBuilder("");
    foreach (char c in number.ToString())
    {
        byte digit = byte.Parse(c.ToString());
        builder.Append(digit * digit);
    }
    return int.TryParse(builder.ToString(), out squared);
}

这可以这样调用:

if (TrySquareDigits(9119, out int result)) { ... } // result = 811181

还有一些其他的音乐会;

  • 请记住,您不想要负整数,因为字符串中的第一项将是减号
  • 由于您正在做平方根并且可能会发生多个字符,因此您可以缓存结果
  • 使用 Linq..

我的尝试是这样的

private static Dictionary<char, int> preComputed = new Dictionary<char, int> ();

public static void Main()
{
    var result = SquareDigits(9119);
    Console.WriteLine(result);
}

private static string SquareDigits(uint input)
{
    return string.Join(string.Empty, input.ToString().Select(x => Square(x)));
}

private static int Square(char  x) {
    if (preComputed.ContainsKey(x))
    {
        return preComputed[x];
    }

    var numberX = Int32.Parse(x.ToString());
    var squared = numberX* numberX;
    preComputed[x] = squared;
    return squared;
}

https://dotnetfiddle.net/NOHXhs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM