奋斗小蜗牛在请客
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描写叙述
-
一路艰辛一路收获。成功爬过金字塔的小蜗牛别提多高兴了。这不为了向以前帮助他的哥们们表达谢意,蜗牛宴请这些亲朋好友。
席间。蜗牛发现老鹰一直愁眉不展。就关切的问下老鹰。老鹰说:“近来。有一道题我一直没解决,非常是郁闷”。蜗牛说:“说说看,看能不能帮你解决掉。老朋友”。
老鹰说:“给一个数。用二进制表达,假设这个数转化为二进制后小数位超过20位。那么仅仅要前二十位,其余的不要”,小蜗牛如今非常忙。没时间帮助老鹰。
亲爱的兄弟姐妹们,不知道你是否能帮忙解决这个问题。来试下,加油!
!
!
- 输入
- 多组測试数据。
每组输入一个数N(不超double) - 输出
- 输出相应的二进制(假设小数部分前20所有为0,则将小数部分视为0,不输出小数部分,不输出多余部分比方:(不输出1.00100000000000000000而输出1.001)
- 例子输入
-
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(" "); } return 0; }