我正在处理来自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。我知道有改变基数的内置方法,但是由于这是一个练习,因此我倾向于通过自己的函数实现来转换它。
任何帮助将不胜感激!
答案 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);