nyoj-647-奋斗小蜗牛在请客(进制转换)

奋斗小蜗牛在请客

时间限制: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;
}


【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/llguanli/p/8450021.html