整理一下,免得自己忘記,也希望能幫到有需要的人。
————————————————————————我是一條華麗的分割線————————————————————————
全局變量:雙精度浮點數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編程從初學到精通 。