namespace program
{
class Program
{
static void Main(string[] args)
{
string a, c = null, c1 = null;
int b, b1;
a = Console.ReadLine();
if (a.IndexOf('.') > 0)
{
string dot = a.Split('.')[1];
double z1 = Convert.ToInt32(dot) * Math.Pow(10, -dot.Length);
for (int i = 0; i < 6; i++) //保留了六位二进制小数
{
b1 = (int)(z1 * 2);
z1 = z1 * 2 - b1;
c1 = c1 + Convert.ToString(b1)
}
c1 = "." + c1;
}
string inum = a.Split('.')[0];
int z = Convert.ToInt32(inum);
for (; z != 0; )
{
b = z % 2;
z = z / 2;
c = Convert.ToString(b) + c;
}
Console.WriteLine("{0}{1}", c, c1);
}
}
}
—————————————————————————(看懂代码的,下面解释部分可选择性观看)
大体解释:
这段代码的核心是十转二的方法:整数部分,除二取余,逆序排列。小数部分,乘二取整,正序排列。这两部分转换都用一个简单的for循环就可以得到。
而如何把得到的每个二进制数按正确顺序排列起来,我认为最简单的方法就是化成字符串形式。就是这两句代码 c=Convert.Tostring(b)+c//将余数b转化为字符型,并将新得的余数放在前面,也就是逆序排列(整数部分) c1=c1+Convert.Tostring(b1)//将整数b1转化为字符型,并将新得的整数放在后面,也就是正序排列(小数部分)
分别得到这两部分的二进制后,便可以合在一起输出啦。因为整数二进制和小数二进制部分都是字符串形式,所以合在一起输出是非常简单的。
具体解释:
- if (a.IndexOf(’.’) > 0)这句话是判断a中是否有小数点。该语句中包含的方法IndexOf(’.’),它的功能是在a字符串中寻找字符’.‘并将首次出现的位置返回,如果没找到该字符,返回-1。 这里之所以判断a是否含有小数点(a是否是小数),是因为如果a不是小数还执行字符串的分割会导致索引超出数组界限。
(它根本分不开,因为找不到小数点,是不存在a.Split(’.’)[1]的,这里的[1]就是超出数组界限了,它只有一块,索引只能是[0]) - string dot = a.Split(’.’)[1]; 把字符串a分割,以’.‘为界限,把小数点后面的部分(也就是第二部分,所以索引是1)赋给dot(例如a是12.54,把54赋给dot)。
同理,string inum = a.Split(’.’)[0]; 就是把小数点前面代表整数的字符串(也就是第一部分,所以索引是0)赋给inum. - double z1 =Convert.ToInt32(dot) * Math.Pow(10, -dot.Length); 把小数部分数字转化为小数(例如12.54的小数部分是54,把54转化为0.54)。Math. Pow(x,y)意为数字x的y次幂。在这里就是10的负长度次幂。dot. length就是计算dot的长度。
————————————
具体解释里的加粗字体是几个比较常见的方法,有不懂的可以再去找更详细的解释,了解他们更多的重载方法。
第一次写,记录自己的学习过程,可能会有些错误,欢迎指正。