我正在尝试对数字的每个数字求平方并返回具有所有平方值的整数。例如,如果输入的整数是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;
}
注意:您可能希望使用long
而不是int
作为返回类型,以便在遇到溢出之前允许使用更大的返回类型。
怎么样?
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);
尝试这种可靠的方法:
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);
}
}
}
您可以使用此功能。在您的代码中,由于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);
}
这不起作用,因为空字符串不是有效的分隔符。但是字符串是字符的枚举。在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);
}
而不是仅使用字符串(像大多数其他答案一样),您应该使用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());
}