[英]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。
通过使用long
或System.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
,而不仅仅是使用字符串(像大多数其他答案一样)。 数字也不必使用int
, byte
就足够了。 此外,这是一个 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
还有一些其他的音乐会;
我的尝试是这样的
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.