今天,毛线同学写作业的时候,突然冒出个想法:写个十进制小数转二进制小数的程序如何? 我一想,中!。刚好写作业的时候,需要用到。
于是,立即回寝室。写起。完成的还是挺快的.
10进制纯小数转2进制小数的方法,很简单。就是对小数部分,乘二。之后,对整数位取整。整数位为0就是零,为1就是1,然后整数位归零。重复这个过程。
直到,得出的结果为0。
/*
* 名称:限制版进制转换
*
* 概述 :十进制小数转换二进制,不可直接用分数作为输入。
*
* 作者:CSB
*
* 日期:13/5/1
*
*/
#include <iostream>
using namespace std;
//
// 常量
//
const int precision = 100; //精确到几位,即算出来的小数的最大位数
const double ratio = 0.000000001; //精度,当一个浮点数与ratio的差小于ratio时,则算作0
//
// 函数定义
//
/***************************************************************
*
* 判断输入的小数,是否小于精度值
* 小于则判断为0,返回真
*
*/
bool is_zero( const double &in )
{
if( in - ratio < ratio )
{
return true;
}
else
{
return false;
}
}
/***************************************************************
*
* 功能:10进制转换为2进制
*
* 概述:每步对十进制小数乘二取整,然后继续对剩下的小数部分,乘二取整
* 直到小数部分变为零
*
* 输入数的类型,要求为纯小数。
*
*/
void Dec_To_Bin(double &in)
{
int time = 0,sign_bit = 0;
//当输入的数为负数时,取这个数的绝对值,同时sign_bit置1(表示符号位)。
if( in > 1)
{
cout<<"整数部分不为0,暂时不支持这种转换"<<endl;
return;
}
else
if( in < 0 )
{
in = abs(in);
sign_bit = 1;
}
//输出符号位和小数点
cout<<sign_bit<<'.';
//输入数为0,则直接输出0
if( is_zero(in) )
{
cout<<0<<endl;
return;
}
//进行运算,乘二后的得数,若大于1,则证明整数部分为1,输出1.
//同理小于1输出0,当得数等于1时,转换完成。
while( time <= precision )
{
in *= 2;
if( in > 1 )
{
in -= 1;
cout<<1;
}
else
if( in == 1 )
{
cout<<1<<endl;
break;
}
else
if( in < 1 && in > 0)
{
cout<<0;
}
time++;
}
}
/***************************************************************
*
* 功能:输入十进制小数,转换为二进制小数,支持多次输入
*
* 注意:当一个小数后面跟着字符的时候,会只计算那个小数。同时,后面的字符
* 会被清除
*
*/
void input_Dec_Output_Bin()
{
double in = 0.;
char q = ' ';
while( q != 'q' )
{
cout<<"请输入需要转换的小数: ";
cin>>in;
//清空输入缓冲区,防止错误输入
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
Dec_To_Bin(in);
cout<<"退出请按q,继续请输入其他字符"<<endl;
cin>>q;
//清空输入缓冲区,防止错误输入
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
}
int main(void)
{
system("color 0e");
input();
return 0;
}