2009-01-23 18:16:35來源不明

96高市資訊學科能力競賽 設計一含小數點的十進位轉二進位的程式

本題重點:
不採用double的輸入,準確值的問題,所以看起來有點長。
整數部分的轉換應該不用說吧@@?

原本為?/2+?/(2^2)+?/(2^3).... 每乘1個2 
?就會跳出來 也就是我的答案

/************************************************************/

  1. #include<stdio.h>   
  2. #include<stdlib.h>   
  3. main()   
  4. {   
  5.  char x[10];   
  6.  while(gets(x))   
  7.   {   
  8.    int a,b,temp=0,temppoint=0;   
  9.    for(a=0;a<strlen(x);a++)   
  10.     {   
  11.      if(x[a]=='.')   
  12.       break;   
  13.      temp=temp*10+x[a]-48;    
  14.     }   
  15.    for(b=a+1;b<strlen(x);b++)   
  16.     {   
  17.      temppoint=temppoint*10+x[b]-48;   
  18.     }    
  19.    int n=a,n1=b-a-1;/*n為整數部分的位數 n1為小數點部分的位數*/  
  20.    int y[50];   
  21.    /*以下為整數部分的處理*/  
  22.    a=0;   
  23.    if(temp!=0)                
  24.     {          
  25.      while(temp!=1)         
  26.       {      
  27.        y[a]=temp%2;      
  28.        temp=temp/2;      
  29.        a++;      
  30.       }      
  31.      printf("1");          
  32.      for(b=a-1;b>=0;b--)    
  33.       {       
  34.        printf("%d",y[b]);       
  35.       }       
  36.      printf(".");       
  37.     }      
  38.     else     
  39.      printf("0.");   
  40.    /*以下為小數點的處理*/  
  41.    int m=1;   
  42.    for(a=0;a<n1;a++)   
  43.     {   
  44.      m=m*10;   
  45.     }   
  46.    /*重點:原本為?/2+?/(2^2)+?/(2^3).... 每乘1個2 ?就會跳出來 也就是我的答案*/  
  47.    /*本方法由學長傳授*/     
  48.    while(1)   
  49.     {   
  50.      temppoint=temppoint*2;   
  51.      printf("%d",temppoint/m);   
  52.      temppoint=temppoint%m;   
  53.      if(temppoint==0) break;   
  54.     }      
  55.     printf("\n");   
  56.   }   
  57.  return 0;   
  58. }