整理一下,免得自己忘记,也希望能帮到有需要的人。
————————————————————————我是一条华丽的分割线————————————————————————
全局变量:双精度浮点数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编程从初学到精通 。