我是编程C#的新手,我从以下方面学到了几乎所有的信息: http://unity3d.com/learn/tutorials/modules/beginner/scripting,youtube,此网站以及通过Google找到的许多编程教程网站。
在我的Unity中的monobehavior代码中,我最终试图制作一个基础12计算器。 为此,我需要12个数字,我写了一个字符串数组来代表它们:
private string[] numerals = {"0","1","2","3","4","5","6","7","8","9","X","E"};
public string thisNum;
我的Start和calcNum函数:
void Start ()
{
thisNum = numerals[10];
calcNum ();
}
void calcNum ()
{
print(thisNum);
}
这很棒,我可以输入:print (thisNum);
,然后返回X
。
但是,如何获得:print (thisNum + thisNum)
返回18
?
我知道它不是一个整数,因此它不能添加2个字符串来获得总和,而是获得:XX
。
那么,我如何将X表示为这么多:
o o o,o o o,o o o,o
而不只是字母X.我现在重置这个项目大约6次。
我在考虑for循环或if(X)而不是10,但是,我总是使用基数10来表示数字,这有点蹩脚。
我只需要一点努力就能朝着正确的方向前进,并且真的很感激帮助,
谢谢。答案 0 :(得分:1)
这可能会有所帮助。
从一个字符数组开始,而不是字符串。
var numerals = new []
{
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'X', 'E',
};
创建几个词典以返回每个数字的基数10值并执行反向查找。
var nis =
numerals
.Select((n, i) => new { n, i })
.ToArray();
var n2i = nis.ToDictionary(_ => _.n, _ => _.i);
var i2n = nis.ToDictionary(_ => _.i, _ => _.n);
然后要在base 10和base 12之间进行转换,你需要几个辅助函数。
Func<int, IEnumerable<char>> getReversedNumerals = null;
getReversedNumerals = n =>
{
IEnumerable<char> results =
new [] { i2n[n % 12], };
var n2 = n / 12;
if (n2 > 0)
{
results = results.Concat(getReversedNumerals(n2));
}
return results;
};
Func<IEnumerable<char>, int, int> processReversedNumerals = null;
processReversedNumerals = (cs, x) =>
cs.Any()
? x * n2i[cs.First()]
+ processReversedNumerals(cs.Skip(1), x * 12)
: 0;
现在您可以根据帮助程序定义转换函数。
Func<int, string> convertToBase12 =
n => new String(getReversedNumerals(n).Reverse().ToArray());
Func<string, int> convertToBase10 =
t => processReversedNumerals(t.ToCharArray().Reverse(), 1);
最后你可以进行转换:
var b10 = convertToBase10("3EX2"); //6890
var b12 = convertToBase12(6890); //3EX2
答案 1 :(得分:0)
这取决于您如何吸收和存储值。
假设您将它们存储为基本12字符串,您需要在它所代表的整数base10值和您用来表示它的字符串值之间来回转换方法
public String Base12Value(int base10)
{
String retVal = "";
while (base10 > 0)
{
//Grab the mod of the value, store the remainder as we build up.
retVal = (base10 % 12).ToString() + retVal;
//remove the remainder, divide by 12
base10 = (base10 - (base10 % 12)/12);
}
return retVal;
}
public int Base10Value(String base12)
{
int retVal = 0;
for (int i = 1; i <= base12.Length; i++)
{
int tmpVal = 0;
char chr = base12[base12.Length-i];
//Grab out the special chars;
if (chr == 'X')
{
tmpVal = 10;
} else if (chr == 'E')
{
tmpVal = 11;
}
else
{
tmpVal = int.Parse(chr.ToString());
}
//Times it by the location base.
retVal += tmpVal * (10 ^ (i - 1));
}
return retVal;
}
所以你可以做一些像
这样的事情print(Base12Value(Base10Value(thisNum) + Base10Value(thisNum)));
这有点笨重,但完成工作。
答案 2 :(得分:0)
哦,尽管有些人已经说过了,但是自从我开始工作以来,这就是我的。
using System;
using System.Text;
using System.Collections.Generic;
public class Base12
{
public static void Main()
{
Base12 X = new Base12(10);
Base12 X2 = new Base12(10);
Base12 XX = X + X2;
Console.WriteLine(XX); // outputs 18
}
public int DecimalValue { get; set; }
public readonly char[] Notation = new char[] {'0', '1' , '2' , '3', '4', '5' , '6', '7', '8', '9', 'X', 'E'};
public Base12(int x)
{
DecimalValue = x;
}
public override string ToString()
{
List<char> base12string = new List<char>();
int copy = DecimalValue;
while(copy > 0)
{
int result = copy % 12;
base12string.Add(Notation[result]);
copy = copy / 12;
}
StringBuilder str = new StringBuilder();
for(int i = base12string.Count - 1; i >= 0; i--)
{
str.Append(base12string[i]);
}
return str.ToString();
}
public static Base12 operator+(Base12 x, Base12 y)
{
return new Base12(x.DecimalValue + y.DecimalValue);
}
// Overload other operators at your wish
}
答案 3 :(得分:0)
这是我对您的问题的实施。我不得不说,这是一个有趣的项目! 我不想使用任何小数值,因为我认为这是作弊。我只使用小数作为列表的de index。
using System;
using System.Collections.Generic;
using System.Linq;
class Base12
{
static IList<char> values = new List<char>{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'E' };
public string Value { get; set; }
public Base12(string value)
{
this.Value = value;
}
public static Base12 operator +(Base12 x, Base12 y)
{
var xparts = x.Value.ToArray();
var yparts = y.Value.ToArray();
int remember = 0;
string result = string.Empty;
for (int i = 0; i < Math.Max(yparts.Length, xparts.Length) ;i++)
{
int index = remember;
if (i < xparts.Length)
{
index += values.IndexOf(xparts[xparts.Length - i - 1]);
}
if (i < yparts.Length)
{
index += values.IndexOf(yparts[yparts.Length - i - 1]);
}
if (index > 11)
{
index -= 12;
remember = 1;
}
else
{
remember = 0;
}
result = values[index] + result;
}
if (remember > 0)
{
result = values[remember] + result;
}
return new Base12(result);
}
public static implicit operator Base12(string x)
{
return new Base12(x);
}
public override string ToString()
{
return this.Value;
}
}
以下是您可以使用它的方法:
Base12 x = "X";
Base12 y = "X";
Base12 z = x + y;
Debug.Print(z.ToString());
// returns 18
Base12 x = "X12X";
Base12 y = "X3";
Base12 z = x + y;
Debug.Print(z.ToString());
// returns X211