所以我想知道将任何基数转换为十进制(基数为10):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SoloLearn
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("What is the number you want to convert?");
string num = Console.ReadLine();
Console.WriteLine("In what base is this number?");
int mathBase = int.Parse(Console.ReadLine());
double output = 0;
int j = 0;
char[] nums = num.ToCharArray();
for(int i=num.Length - 1; i>=0; i--) {
output = output + Math.Pow(mathBase,i) * nums[j] * 1;
Console.WriteLine("i: " + i +", j:" + j + ", nums[j]: " + nums[j] + ", output: " + output + ", mathBase: " + mathBase + ", " + Math.Pow(mathBase,i) + ".");
j++;
}
Console.WriteLine("The number " + num + " in base 10 (Decimal) is " + output + ".");
Console.ReadLine();
}
}
}
所以我开始使用二进制文件(num = 100,mathBase = 2),但答案很疯狂。这就是为什么我添加这个代码来看看发生了什么:
Console.WriteLine("i: " + i +", j:" + j + ", nums[j]: " + nums[j] + ", output: " + output + ", mathBase: " + mathBase + ", " + Math.Pow(mathBase,i) + ".");
j++;
而且,所有变量都是正确的:
所以是的,我真的不知道会发生什么,因为所有的计算似乎都是正确的(Math.Pow(mathBase,i) = 2^2 = 4
,如图所示但是4 * nums[j] = 4 * 1 = 196
?如果有人知道发生了什么,请告诉我! / p>
答案 0 :(得分:1)
您的问题是nums
是char[]
。因此nums[j]
是一个字符。现在你遇到的问题是char可以隐式转换为数字而不是你想要的方式 - 它使用的是ascii值,因此1是ascii值49和0是ascii值48.这就是数学错误。
您需要做的是将输入sting转换为int数组,而不是字符数组。可能执行此操作的一些示例代码是:
int[] nums = num.Select(x=>x-'0').ToArray();
这样做是因为字符0-9是ascii 48-57这一事实,如果你从ascii 0(48)中取出每一个,你将得到0-9。它还利用了一个字符串也是IEnumerable<char>
的事实,因此可以很容易地LINQed。
通过此修改,您的程序应该按预期工作。
答案 1 :(得分:0)
这里num [j]是一个char,所以你应该在任何计算之前将它转换为int。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SoloLearn
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("What is the number you want to convert?");
string num = Console.ReadLine();
Console.WriteLine("In what base is this number?");
int mathBase = int.Parse(Console.ReadLine());
double output = 0;
int j = 0;
char[] nums = num.ToCharArray();
for(int i=num.Length - 1; i>=0; i--) {
output = output + Math.Pow(mathBase,i) * Int32.Parse(nums[j].ToString()) * 1;
Console.WriteLine("i: " + i +", j:" + j + ", nums[j]: " + nums[j] + ", output: " + output + ", mathBase: " + mathBase + ", " + Math.Pow(mathBase,i) + ".");
j++;
}
Console.WriteLine("The number " + num + " in base 10 (Decimal) is " + output + ".");
Console.ReadLine();
}
}
}
答案 2 :(得分:0)
从任意基数转换时,您必须至少处理三个范围:
$absolute_url = full_url( $_SERVER );
echo $absolute_url;
$url = getUrl( $_SERVER );
echo $url;
所以你必须在你的代码中插入它:
'0'..'9' corresponds to 0..9
'a'..'z' corresponds to 10..36
'A'..'Z' corresponds to 10..36
P.S。在 Linq 的帮助下,你可以提出简洁:
for (int i=num.Length - 1; i>=0; i--) {
// actual char, say 'C'
int c = nums[j];
// corresponding integer value, 12
int v = 0;
if (c >= '0' && c <= '9')
v = c - '0';
else if (c >= 'a' && c <= 'z')
v = c - 'a' + 10;
else if (c >= 'A' && c <= 'Z')
v = c - 'A' + 10;
// please, notice not nums[j] but the value it corresponds to - v
output = output + Math.Pow(mathBase, i) * v;
...
}