十进制、二进制带小数部分的相互转换

基本思想

十进制转二进制:

(1) 从键盘读入一串字符型数组。通过 “ . ” 判断十进制数是否含有小数位。
(2) 把整数位和小数位进行分离,分别放入data1和data2数组中。通过atof()函数分别把字符型数组data1、data2转为整数。并对整数和小数部分分别进行进制转换。
(3) 整数部分:根据十进制转二进制的计算特点,声明一个栈,对余数进行存储。
小数部分:小数*2后的整数部分直接输出。

二进制转十进制:

(1) 从键盘读入一串字符型数组。通过“ .”判断二进制数是否含有小数位。
(2) 把整数位和小数位进行分离,分别放入data1和data2数组中。根据二进制转十进制小数部分和整数部分的计算特点,对其分别进行进制转换。

#include<bits/stdc++.h>
using namespace std;
//十进制转二进制 
void oTob(char *data){
	char data1[100];
	char data2[100];
	int i;
	double X;
	int len1 = strlen(data);
	for(i = 0;i < len1;i ++){
		if(data[i] == '.' || data[i] == '\0') break;
		data1[i] = data[i];
		}
		if(data[i] == '.'){
			i = i + 1;
			for(int j = 0;i < len1;i ++,j ++){
				data2[j] = data[i];
		}
	}
	//整数部分
	int S = atof(data1);//字符型转整数
	stack<int> q; //栈
	while(S != 0){
		q.push(S%2);
		S = S / 2;
	} 
	while(!q.empty()){
		printf("%d",q.top());
		q.pop();
	}
	//小数部分
	if(data2[0] != '\0'){
		X = atof(data2);
		int len2 = strlen(data2);
		int j = 0;
		while(data2[j] != '\0'){
			X = X / 10;
			j ++;
		}
		printf(".");//小数点 
		while(1){
		X = X * 2;
		int intX = (int)X;
		printf("%d",intX);
		X = X - intX;
		if(X == 0) break;
		}
	} 	
}

void bToo(char *data){
	char data1[100];
	char data2[100];
	int i;
	int len = strlen(data);
	for(i = 0;i < len;i ++){
		if(data[i] == '.' || data[i] == '\0') break;
		data1[i] = data[i];
		}
		if(data[i] == '.'){
			i = i + 1;
			for(int j = 0;i < len;i ++,j ++){
				data2[j] = data[i];
		}
	}
	//整数部分 
	int len1;
	int sum = 0;
	int sum1 = 1;
	len1 = strlen(data1);
	sum += data1[len1 - 1] - '0';
	for(int j = len1 - 2;j >= 0;j --){
		sum1 = sum1 * 2;
		sum += (data1[j] - '0') * sum1;
	}
	cout << sum;	
	//小数部分
	if(data2[0] != '\0'){
		int len2;
		sum = 0;
		sum1 = 1;
		len2 = strlen(data2);
		sum += data2[0] - '0';
		for(int j = 1;j < len2;j ++){
			sum1 = sum1 * 2;
			sum += (data2[j] - '0') * sum1;
		}
		cout << "." <<sum;
		}
} 
//十进制包含小数转换二进制
//二进制包含小数转换十进制 
int main(){
	char data[100];
	printf("选择:\n");
	printf("1 十进制转二进制\n");
	printf("2 二进制转十进制\n"); 
	int n;
	scanf("%d",&n);
	switch(n){
		case 1 : 
			scanf("%s",data);
			oTob(data);
		break;
		case 2:
			scanf("%s",data);
			bToo(data);
		break;
	}
	return 0;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值