数组有字符串值,我想要一个整数

时间:2014-10-10 03:17:00

标签: c# arrays algorithm math base

我是编程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来表示数字,这有点蹩脚。

我只需要一点努力就能朝着正确的方向前进,并且真的很感激帮助,

谢谢。

4 个答案:

答案 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