nyoj-647-奮鬥小蝸牛在請客(進制轉換)
阿新 • • 發佈:2018-02-16
其余 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-奮鬥小蝸牛在請客(進制轉換)