标签:
一路艰辛一路收获,成功爬过金字塔的小蜗牛别提多高兴了。这不为了向曾经帮助他的哥们们表达谢意,蜗牛宴请这些亲朋好友。
席间,蜗牛发现老鹰一直愁眉不展。就关切的问下老鹰。老鹰说:“近来,有一道题我一直没解决,很是郁闷”。蜗牛说:“说说看,看能不能帮你解决掉,老朋友”。老鹰说:“给一个数,用二进制表达,如果这个数转化为二进制后小数位超过20位,那么只要前二十位,其余的不要”,小蜗牛现在很忙,没时间帮助老鹰。
亲爱的兄弟姐妹们,不知道你能否帮忙解决问题。来试下,加油!!!
1 1.5 0.000001 0.000000999
1 1.1 0.00000000000000000001 0.00000000000000000001
解题思路:
可以将小数分为整数和小数两部分,然后分别转换成二进制,整数小数都要用数组来存储转换信息,避免越界。
整数转换为二进制用到的是辗转取余法,而小数转换为二进制用到的是相乘取整法。
求小数的整数和小数部分,用(int)求得其整数部分,然后本值减去整数部分即为小数部分。
注意小数点的输出条件
代码
#include<stdio.h> #include<string.h> int zheng[10000]; int xiao[25]; int main() { int i; double x; int max; double min; int numz,numx; while(scanf("%lf",&x)!=EOF) { /* 已知一个小数,求其小数部分和整数部分 则用(int)求其整数部分, 然后本值再减去(int)求小数部分 */ max=(int)x; min=x-max; //整数部分转换也要用数组,避免越界 if(max==0) printf("0"); else { numz=1; while(max) { zheng[numz]=max%2; max/=2; numz++; } for(i=numz-1;i>=1;i--) printf("%d",zheng[i]); } /* numz=1; do { zheng[numz]=max%2; max/=2; numz++; }while(max!=0); //以后如果转换进制需要用数组存储,则用do-while for(i=numz-1;i>=1;i--) printf("%d",zheng[i]); */ numx=1; while(numx<21&&min) { xiao[numx]=(int)(min*2); //min=min*2-xiao[numx]; if(min*2>=1) min=min*2-xiao[numx]; else min*=2; numx++; } for(i=numx-1;i>=1;i--) if(xiao[i]!=0) break;//注意i从numx-1开始 numx=i; if(numx!=0) printf("."); //避免没小数但是输出 . for(i=1;i<=numx;i++) printf("%d",xiao[i]); printf("\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wangluoershixiong/article/details/46761657