1. 程式人生 > >nyoj-647-奮鬥小蝸牛在請客(進制轉換)

nyoj-647-奮鬥小蝸牛在請客(進制轉換)

其余 consola break -i 輸入 line sca article height

奮鬥小蝸牛在請客

時間限制: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("\n");
	}
	return 0;
}


nyoj-647-奮鬥小蝸牛在請客(進制轉換)