• 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;
    }


  • 相关阅读:
    Unraid 8 虚拟机 KVM(Ubuntu Server、Windows 10)
    Unraid 9 优化 IPv6 访问(LANraragi 示例)
    1451. 重新排列句子中的单词
    144. 二叉树的前序遍历
    模拟键盘输入 keybd_event()
    Hive元数据信息对应MySQL数据库表
    书单
    Manjaro Gnome Hidpi 缩放问题
    Manjaro Linux 魔兽世界 使用黑盒工坊安装插件
    nginx系列【设置开机自启动】
  • 原文地址:https://www.cnblogs.com/llguanli/p/8450021.html
Copyright © 2020-2023  润新知