【筆記】【C語言】任意進制之間的轉換(支持小數部分)


 

  整理一下,免得自己忘記,也希望能幫到有需要的人。

————————————————————————我是一條華麗的分割線————————————————————————

  全局變量:雙精度浮點數p、字符數組out。

  當其他進制轉換成十進制時,將轉換結果存儲在浮點數p中;當十進制轉換成其他進制時,將結果以字符串的形式存放在字符數組out中。

  轉換過程分為整數部分和小數部分,整數部分轉換后需逆序輸出,而小數部分順序輸出。

例如:

Conversion(num,8,10);

  表示將num字符串數組所對應的一個八進制數轉換成一個十進制數。

直接上代碼

  1 int Conversion(char num[20], int t, int n)
  2 {
  3     int i,ii,j,k,m,x,b[30],h[30],c;
  4     double d,r;
  5     ii=0; 
  6     p=0;
  7     memset(out,0,20);
  8     m=strlen(num);//求字符串的長度
  9     x=m; 
 10     for(k=0,j=0;k<m;k++)//主要是分段,以小數點為界限,只轉換整數部分 
 11     { 
 12        if(num[k]=='.') 
 13        { 
 14           x=k; 
 15           break; 
 16        } 
 17     }
 18 
 19     for(j=x-1;j>=0;j--) 
 20     { 
 21        if(num[j]=='-') break; //符號的處理 
 22        if(num[j]=='A') r=10; 
 23        else if(num[j]=='B') 
 24           r=11; 
 25        else if(num[j]=='C') 
 26           r=12; 
 27        else if(num[j]=='D') 
 28           r=13; 
 29        else if(num[j]=='E') 
 30           r=14; 
 31        else if(num[j]=='F')
 32           r=15; 
 33        else 
 34           r=num[j]-'0';//將字符轉換成數字 
 35        p=p+r*(pow ((double)t,(double)(x-j-1)));//計算結果 
 36     }
 37 
 38     if(num[x]=='.') 
 39     { 
 40        for(j=x+1;j<m;j++)
 41        {
 42           if(num[j]=='A') r=10; 
 43           else if(num[j]=='B') 
 44              r=11; 
 45           else if(num[j]=='C') 
 46              r=12; 
 47           else if(num[j]=='D') 
 48              r=13; 
 49           else if(num[j]=='E') 
 50              r=14; 
 51           else if(num[j]=='F') 
 52              r=15; 
 53           else 
 54              r=num[j]-'0';//將字符轉換成數字 
 55           p=p+r*(pow ((double)t, (double)(x-j))); 
 56        } 
 57     }
 58     //g_print("%f",p);
 59     if(n==10)//如果要轉換成十進制
 60     { 
 61        if(num[0]=='-') 
 62        {
 63           p=-p;
 64        }
 65        return 0;
 66     } 
 67      
 68     else //如果要轉換成其他進制
 69     {
 70        k=(int)p;
 71        i=0; 
 72        while(k)//判定需要轉換的數是否變為0 
 73        { 
 74           h[i++]=k%n;//取余,進行進制轉換,但是順序與正確值相反 
 75           k/=n;//轉換一位之后進行相應的變化 
 76        } 
 77        c=0; 
 78        if(p!=(int)p)//選擇性計算,如果是整數就不用進行這一步的計算了
 79        { 
 80           d=p-(int)p;//取小數部分 
 81           while(d!=0) 
 82           { 
 83              b[c]=(int)(d*n);//算法為×N取整 
 84              d=d*n-b[c]; 
 85              c++; 
 86              if(c>=10) 
 87                 break;//主要是控制小數后面萬一出現無限小數的時候好跳出循環以免出現死循環 
 88           } 
 89        }
 90        if(num[0]=='-')
 91        {   
 92            out[0]='-';
 93            ii++;
 94        }
 95        for(j=i-1;j>=0;j--,ii++)//反序輸出,大於10的數字進行相應的變化 
 96        { 
 97           if(h[j]==10) out[ii]='A';
 98           else if(h[j]==11) out[ii]='B';
 99           else if(h[j]==12) out[ii]='C';
100           else if(h[j]==13) out[ii]='D';
101           else if(h[j]==14) out[ii]='E';
102           else if(h[j]==15) out[ii]='F';
103           else if(h[j]==9)  out[ii]='9';
104           else if(h[j]==8)  out[ii]='8';
105           else if(h[j]==7)  out[ii]='7';
106           else if(h[j]==6)  out[ii]='6';
107           else if(h[j]==5)  out[ii]='5';
108           else if(h[j]==4)  out[ii]='4';
109           else if(h[j]==3)  out[ii]='3';
110           else if(h[j]==2)  out[ii]='2';
111           else if(h[j]==1)  out[ii]='1';
112           else out[ii]='0';
113        } 
114        if(p!=(int)p)//選擇性輸出,這樣可以節約輸出時間和程序的運行時間 
115        {
116           out[ii++]='.';
117           for(j=0;j<c;j++)//正序輸出 
118           { 
119              if(b[j]==10) out[ii]='A';
120              else if(b[j]==11) out[ii]='B';
121              else if(b[j]==12) out[ii]='C';
122              else if(b[j]==13) out[ii]='D';
123              else if(b[j]==14) out[ii]='E';
124              else if(b[j]==15) out[ii]='F';
125              else if(b[j]==9) out[ii]='9';
126              else if(b[j]==8) out[ii]='8';
127              else if(b[j]==7) out[ii]='7';
128              else if(b[j]==6) out[ii]='6';
129              else if(b[j]==5) out[ii]='5';
130              else if(b[j]==4) out[ii]='4';
131              else if(b[j]==3) out[ii]='3';
132              else if(b[j]==2) out[ii]='2';
133              else if(b[j]==1) out[ii]='1';
134              else out[ii]='0';
135              ii++;
136           }
137        }
138        //puts(out);
139        return 0;
140     } 
141 }

 

 

參考:Linux C編程從初學到精通 。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM