基本思想
十进制转二进制:
(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;
}