可在任意两个数字基之间切换的C#代码

时间:2019-07-01 19:14:52

标签: c#

我正在处理来自exercism.io的问题,要求提供功能s.t。给定一个数字数组,一个指定的输入基数(例如2的基数)和一个输出基数(例如10的基数),该函数的输出将是新基数中相同数字的数字数组。

例如如果输入为Rebase(2, { 1, 0, 1, 0, 1, 0 }, 10),则输出应为{4, 2}

我已经尝试实现此问题的解决方案,首先将数字重新设置为10的基数,然后根据this page上的方法将数字重新设置为基数,将余数和除以基的商找到号码的数字。

using System;
using System.Collections.Generic;
using System.Linq;

public static class AllYourBase
{
    public static int[] Rebase(int inputBase, int[] inputDigits, int outputBase)
    {
       int baseTen = 0;
       int remainder;
       int quotient;

       LinkedList<int> coeffHolder = new LinkedList<int>();
       if (outputBase <= 1)
        throw new ArgumentException();


    if(inputBase <= 1)
        throw new ArgumentException();


    for(int i = inputDigits.Length-1; i >= 0; i--)
    {
        baseTen += (int)inputDigits[i] * (int)Math.Pow(inputBase, i);
    }

    quotient = baseTen;


    while(quotient > 0)
    {
        remainder = quotient % outputBase;
        coeffHolder.AddFirst(remainder);
        quotient = (int)quotient / (int)outputBase;


    }

    return coeffHolder.ToArray();
    }

}

如上所述,我对Rebase(2, { 1, 0, 1, 0, 1, 0 }, 10)的预期输出是{4, 2},但是由于某种原因,我得到的答案是{2, 1}

我不确定为什么我得到的结果是预期值的一半。

P.S。我知道有改变基数的内置方法,但是由于这是一个练习,因此我倾向于通过自己的函数实现来转换它。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

您正在以相反的顺序(从右到左)处理数字,并随即从右到左减小2的指数(输入基数)。

这会以2的幂(inputBase)从左到右处理数字。

for (int i = 0; i < inputDigits.Length; i++)
{
    int j = inputDigits.Length - (i + 1);
    baseTen += (int)inputDigits[i] * (int)Math.Pow(inputBase, j);
}

答案 1 :(得分:2)

在您的转化循环中:

for(int i = inputDigits.Length-1; i >= 0; i--)
{
    baseTen += (int)inputDigits[i] * (int)Math.Pow(inputBase, i);
}

您说的是,最右边的数字是2升至5的幂(最高有效数字),而应该将两位提高到0的幂(最低有效数字)。

更改:

    baseTen += (int)inputDigits[i] * (int)Math.Pow(inputBase, i);

收件人:

    baseTen += (int)inputDigits[i] * (int)Math.Pow(inputBase, (inputDigits.Length-1) - i);