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;
}
运行如下
注:输入的数字不带小数点会出错
另 :水平有限,如有错误和不足,请指正奥