標籤:
奮鬥小蝸牛在請客時間限制:1000 ms | 記憶體限制:65535 KB難度:2
-
描述
-
一路艱辛一路收穫,成功爬過金字塔的小蝸牛別提多高興了。這不為了向曾經協助他的哥們們表達謝意,蝸牛宴請這些親朋好友。
席間,蝸牛發現老鷹一直愁眉不展。就關切的問下老鷹。老鷹說:“近來,有一道題我一直沒解決,很是鬱悶”。蝸牛說:“說說看,看能不能幫你解決掉,老朋友”。老鷹說:“給一個數,用二進位表達,如果這個數轉化為二進位後小數位超過20位,那麼只要前二十位,其餘的不要”,小蝸牛現在很忙,沒時間協助老鷹。
親愛的兄弟姐妹們,不知道你能否幫忙解決問題。來試下,加油!!!
-
輸入
-
多組測試資料,
每組輸入一個數N(不超double)
-
輸出
-
輸出對應的二進位(如果小數部分前20全部為0,則將小數部分視為0,不輸出小數部分,不輸出多餘部分比如:(不輸出1.00100000000000000000而輸出1.001)
-
範例輸入
-
11.50.0000010.000000999
-
範例輸出
-
11.10.000000000000000000010.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-奮鬥小蝸牛在請客(進位轉換)