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

问题描述 投票:0回答:6

我正在尝试对数字的每个数字求平方并返回具有所有平方值的整数。例如,如果输入的整数是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#还是比较陌生,因此不胜感激-谢谢:)

c#
6个回答
1
投票

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

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;
}

注意:您可能希望使用long而不是int作为返回类型,以便在遇到溢出之前允许使用更大的返回类型。


0
投票

怎么样?

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);

0
投票

尝试这种可靠的方法:

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);
        }
    }
}

enter image description here


0
投票

您可以使用此功能。在您的代码中,由于String[] digits = inputNums.Split("")Split("")不会解析您的字符串。您正在将Split函数发送到空字符串arguments(“”)。

public static int SquareDigits(int n)
        {

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

0
投票

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

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

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

0
投票

而不是仅使用字符串(像大多数其他答案一样),您应该使用StringBuilder。另外,也不必使用int作为数字,byte绰绰有余。

int EveryDigitSquared(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());
}
© www.soinside.com 2019 - 2024. All rights reserved.