2/8进制转换为10进制(含小数)h

本文探讨如何编写代码将二进制小数转换为十进制,涉及整数与小数部分处理、精度问题解决以及使用数组记录数字结构的解决方案。作者分享了遇到的挑战和改进思路,包括double类型精度问题和使用字符数组存储数字技巧。
摘要由CSDN通过智能技术生成

h

 question:要求写一个代码,能够转换2/8进制为10进制

记录一下自己的思路

整数部分容易转换,难点是小数部分

要转化进制,就要把每一位的数字提取出来,记录下这个数字

比如0.11,就要记录下来两个1;

0.101,就要记录下来101,因为小数部分不能直接取余数,只能用计算的方法得出小数。

1.首先想到把小数部分乘10,再去掉整数部分,为了记录,设置一个计数器,每次去掉整数部分计数器 count++;(如0.01的小数位是两位,用计数器能记录小数首位是0的情况)

用一个循环来执行以上操作,判断条件为 小数部分的副本(double类型) 是否 为0

然后再把小数部分 乘 上 10的位数次幂 pow(doupart,count);

得出小数部分的整数值,再进行运算

 while(countofdou<=10){// 位数太长保留十位
      if(doucopy==ZERO){// 如果为 0 跳出 循环 ,得到 countofdou  的值 
         break;
     }
     else if(doucopy<1) {  // <1 说明 小数部分的首位 为 0 
      countofdou++;
     }
     else{
     	doucopy-=(int)doucopy;// 如果大于 1,得到小数部分的值 
      countofdou++; 
	 }
     printf("**%f**\n",doucopy);//用来测试 每轮 的doucopy 是否为0  
     doucopy*=10; // 每轮 进一次位  ,左移一次 
     
    }

但 因为double 类型 精度问题,在循环中 小数部分的副本 doucpy 已经 为0 还在继续运行

于是作罢

2.想到是否能把整数部分和小数部分直接区分开来

int intpart,doupart;
	char c;
	scanf("%d%c%d",&intpart,&c,&doupart);//方便输入小数点

直接区分了两部分,方便处理

但是 有个很明显的问题 ,如果小数部分是011 等首位是0的情况,就会发生丢位 把011记录位11

3.是否能用两个数组分别记录下整数和小数的情况,这样 首位 是 0就不会发生丢位 了

  但 那个小数点 还要处理 就用一个char类型的数组来记录

发现 输入一个数字 ,传进char类型中,强制转换位int 数字会增加48,但声明的数字 不会增加,此处先留下疑惑———**————

char c;
  scanf("%c",&c);
  char ch=5;
  printf("c--%d\nch--%d\n",(int)c,(int)ch);

结果如下

减去48,就能很好的记录下数字

printf("c--%d\nch--%d\n",(int)(c-48),(int)ch);

思路:先创建一个char类型数组 ,记录下数字,小数点位置(区别整数小数部分),回车位置(结束)

再创建两个int类型数组,分别记录下整数和小数部分的值

代码如下

//内是测试 部分


#define BIT 2  //换为 8 即为8-10转换
#include <stdio.h>
int main (void){
	while(1){//方便多次输入
	
	char store[41];
	char intpart [20];
	char doupart [20];
	int i;
	char ch;
	int point=0,line=0;
	for(i=0;i<41;i++){
		store[i]=getchar();
		if(store[0]=='\n')
		return 0;   // 结束条件 //如果直接输入回车 则循环结束
		if(store[i]=='.'){
			point=i;
		//	printf("%d\n",point);
			}//记录小数点的位置  // 测试 point 的值
		if(store[i]=='\n'){
			line=i;  //记录结尾的位置 
			//printf("**%d\n",line);  //测试line的值
			break;
		}	
	}
	double sumofint =0;//整数部分的值
	double sumofdou=0; //小数部分的值
	int j=0;
	for(i=point-1;i>=0;i--,j++){
		intpart[j]=(int)(store[i]-48);
		sumofdou+=intpart[j]*pow(BIT,j);
	}
    for(i=point+1,j=0;i<line;i++,j++){// 正序数 方便求方 
		doupart[j]=(int)(store[i]-48);
		sumofdou+=doupart[j]*pow(BIT,-(j+1));
	}
	printf("%f\n",sumofint+sumofdou);
    puts("****************************");  
}
	return 0;
} 

 运行如下

注:输入的数字不带小数点会出错 

另 :水平有限,如有错误和不足,请指正奥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值