查看原文
其他

C语言每日一练(016)

正念君 嵌入式大杂烩 2021-01-31

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间阅读编程笔记!

题目

1、十进制转换为其他进制

2、其他进制转换为十进制

3、二进制转换为其他进制

4、八进制转换为其他进制

5、十六进制转换为其他进制

代码

1、十进制转换为其他进制

十进制转其他进制: 取余法。下面以十进制转二进制为例,请看下图:

所以十进制105对应的二进制数为1101001,即最后一个余数写在前面,以此类推写到最后一个余数。同样的,十进制数转换为其他进制数也遵循这样的规则。

由此可设计出如下函数:

  1. int deci_to_other_scale(uint deci_num, int scale, char s[])

  2. {

  3. static char ch[] = "0123456789ABCDEF";

  4. char buf[N + 1];

  5. int i = N, j;


  6. if ( !(scale >= 2 && scale <= 16) )

  7. {

  8. s[0] = '\0';

  9. return 0;

  10. }


  11. buf[N] = '\0';

  12. do

  13. {

  14. buf[--i] = ch[deci_num%scale];

  15. deci_num /= scale;

  16. }while(deci_num);


  17. for ( j = 0; j < N-1; j++ )//for ( j = 0; (s[j] = buf[i])!='\0'; i++, j++ );

  18. {

  19. s[j] = buf[i];

  20. i++;

  21. }


  22. return j;

  23. }

定义一个数组buf,用于保存余数,数组最后一个元素保存第一个余数,倒数第二个元素保存第二个余数,依次类推。

然后再把数组buf的元素值依次赋给函数的形参s[],这里把形参s[]称为输出参数,因为这个参数可以把函数内的数据带到该函数外使用。

2、其他进制转换为十进制

以八进制数转化为十进制数为例。如下图:

所以其他进制转换为十进制,首先需要分离出该进制数的各位数,再按权展开,相加即得十进制数。

由此可设计出如下函数:

  1. /*

  2. 如八进制776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510

  3. */

  4. int other_scale_to_deci(char *other_num, int scale)

  5. {

  6. const char figure[] = "0123456789ABCDEF";


  7. char i, j;

  8. char other_len = strlen(other_num), figure_len = strlen(figure);

  9. char deci_num[other_len];

  10. int deci_sum = 0;

  11. char flag = 0;


  12. /* 分离scale进制数的各位,如八进制776分离成7,7,6 */

  13. for ( i = 0; i < other_len; i++ )

  14. {

  15. for ( j = 0; j < scale; j++ )

  16. {

  17. if ( other_num[i] == figure[j] )

  18. {

  19. deci_num[i] = j;

  20. flag = 1;

  21. }


  22. }

  23. /* 不是scale进制数则退出函数 */

  24. if(flag == 0)

  25. {

  26. printf("Input Error!Please Input Again!\n");

  27. return 0;

  28. }

  29. flag = 0;


  30. }


  31. /* scale进制转化为十进制,如八进制转换为十进制数:776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510 */

  32. for ( i = 0; i < other_len; i++ )

  33. {

  34. deci_sum += deci_num[other_len-1-i]*pow(scale, i);

  35. }


  36. return deci_sum;

  37. }

3、二进制转换为其他进制

二进制转换为其他进制:先把二进制转化为十进制数,十进制数再转化为其他进制数。(可调用以上两个函数完成)

可设计如下函数:

  1. int binary_to_other_scale(char *binary_num, int scale, char s[])

  2. {

  3. int deci_sum = 0;


  4. deci_sum = other_scale_to_deci(binary_num, TWO_SCALE);


  5. return deci_to_other_scale(deci_sum, scale, s);

  6. }

4、八进制转换为其他进制

八进制转换为其他进制:先把八进制转化为十进制数,十进制数再转化为其他进制数。

可设计如下函数:

  1. int oct_to_other_scale(char *oct_num, int scale, char s[])

  2. {

  3. int deci_sum = 0;


  4. deci_sum = other_scale_to_deci(oct_num, EIGHT_SCALE);


  5. return deci_to_other_scale(deci_sum, scale, s);

  6. }

5、十六进制转换为其他进制

十六进制转换为其他进制:先把十六进制转化为十进制数,十进制数再转化为其他进制数。 可设计如下函数:

  1. int hex_to_other_scale(char *hex_num, int scale, char s[])

  2. {

  3. int deci_sum = 0;


  4. deci_sum = other_scale_to_deci(hex_num, SIXTEEN_SCALE);


  5. return deci_to_other_scale(deci_sum, scale, s);

  6. }

以上就是各进制之间的转换函数。核心函数为:“十进制转换为其他进制”与“其他进制转换为十进制”。其他函数都是根据这两个函数设计的。程序测试范例结果如下:

完整代码

  1. /*******************************************************************************************************

  2. 题 目:

  3. 1、十进制转换为其他进制

  4. 2、其他进制转换为十进制

  5. 3、二进制转换为其他进制

  6. 4、八进制转换为其他进制

  7. 5、十六进制转换为其他进制

  8. ********************************************************************************************************/

  9. #include <stdio.h>

  10. #include <string.h>

  11. #include <math.h>

  12. #include <stdlib.h>


  13. #define N sizeof(unsigned int)*8

  14. #define uint unsigned int


  15. #define TWO_SCALE 2

  16. #define EIGHT_SCALE 8

  17. #define SIXTEEN_SCALE 16


  18. // 十进制转换为其他进制

  19. int deci_to_other_scale(uint deci_num, int scale, char s[]);

  20. // 二进制转换为其他进制

  21. int binary_to_other_scale(char *binary_num, int scale, char s[]);

  22. // 十六进制转换为其他进制

  23. int hex_to_other_scale(char *hex_num, int scale, char s[]);

  24. // 八进制转换为其他进制

  25. int oct_to_other_scale(char *oct_num, int scale, char s[]);

  26. // 其他进制转换为十进制

  27. int other_scale_to_deci(char *other_num, int scale);

  28. // 另一种二进制转换为十进制的方法(不适用于较大的数据)

  29. int binary_to_deci(uint binary_num);


  30. // 四则运算

  31. //..........


  32. // 测试函数

  33. void Test1(void); // 测试十进制转换为其他进制

  34. void Test2(void); // 测试二进制转换为其他进制

  35. void Test3(void); // 测试十六进制转换为其他进制

  36. void Test4(void); // 测试八进制转换为其他进制

  37. void Test5(void); // 测试其他进制转换为十进制


  38. /*********************************************************************************

  39. * Function Name :main,主函数

  40. * Parameter :void

  41. * Return Value :0

  42. * Function Explain :

  43. **********************************************************************************/

  44. int main(void)

  45. {

  46. Test2();


  47. return 0;

  48. }


  49. /*********************************************************************************

  50. * Function Name : deci_to_other_scale,将无符号整数n翻译成d(2<=scale<=16)进制表示的字符串s

  51. * Parameter : num:要转换的数 scale:进制数 s:保存转换后的数

  52. * Return Value : 0:错误 其他:成功

  53. * Function Explain :

  54. **********************************************************************************/

  55. int deci_to_other_scale(uint deci_num, int scale, char s[])

  56. {

  57. static char ch[] = "0123456789ABCDEF";

  58. char buf[N + 1];

  59. int i = N, j;


  60. if ( !(scale >= 2 && scale <= 16) )

  61. {

  62. s[0] = '\0';

  63. return 0;

  64. }


  65. buf[N] = '\0';

  66. do

  67. {

  68. buf[--i] = ch[deci_num%scale];

  69. deci_num /= scale;

  70. }while(deci_num);


  71. for ( j = 0; j < N-1; j++ )//for ( j = 0; (s[j] = buf[i])!='\0'; i++, j++ );

  72. {

  73. s[j] = buf[i];

  74. i++;

  75. }


  76. return j;

  77. }


  78. /*********************************************************************************

  79. * Function Name : binary_to_other_scale,二进制数转换为其他进制数

  80. * Parameter : binary_num:二进制数 scale:进制数 s:保存转换后的数

  81. * Return Value : 0:错误 其他:成功

  82. * Function Explain :

  83. **********************************************************************************/

  84. #if 1

  85. int binary_to_other_scale(char *binary_num, int scale, char s[])

  86. {

  87. int deci_sum = 0;


  88. deci_sum = other_scale_to_deci(binary_num, TWO_SCALE);


  89. return deci_to_other_scale(deci_sum, scale, s);

  90. }

  91. #else

  92. uint binary_to_other_scale(uint binary_num, uint scale, char s[])

  93. {

  94. uint deci_num = 0;


  95. deci_num = binary_to_deci(binary_num);


  96. return deci_to_other_scale(deci_num, scale, s);

  97. }

  98. #endif



  99. /*********************************************************************************

  100. * Function Name : binary_to_deci,二进制数转换为十进制数

  101. * Parameter : binary_num:二进制数

  102. * Return Value : 0:错误 其他:成功

  103. * Function Explain :

  104. **********************************************************************************/

  105. /*

  106. 程序要点:记录二进制数中“1”的位置

  107. 如二进制数:1101

  108. 则保存“1”位置的数组为:buf[3] = {3, 2, 0} (低位保存在数组末位元素中)

  109. 转换的十进制数为:deci_num = pow(2,3) + pow(2, 2) + pow(2, 0)

  110. */

  111. int binary_to_deci_scale(uint binary_num)

  112. {

  113. char binary_str[64];

  114. char *buf = NULL;

  115. char i = 0, j = 0, len = 0;

  116. int deci_num = 0, buf_len = 0;


  117. sprintf(binary_str, "%d", binary_num);

  118. len = strlen(binary_str);

  119. buf = (char*)malloc(len*sizeof(char));


  120. /* 记录“1”的位置 */

  121. for ( i = len - 1; i >= 0; i-- )

  122. {

  123. if ( binary_str[i] == '1' )

  124. {

  125. buf[j++] = len -1 - i;

  126. printf("%d, ", len -1 - i);

  127. }

  128. buf_len = j;

  129. }


  130. /* 转换为十进制数 */

  131. for ( j = 0; j < buf_len; j++ )

  132. {

  133. deci_num += pow(2, buf[j]);

  134. }

  135. free(buf);


  136. return deci_num;

  137. }


  138. /*********************************************************************************

  139. * Function Name : hex_to_other_scale,十六进制转换为其他进制

  140. * Parameter : hex_num:十六进制数 scale:进制数 s:保存转换后的数

  141. * Return Value : 0:错误 其他:成功

  142. * Function Explain :

  143. **********************************************************************************/

  144. int hex_to_other_scale(char *hex_num, int scale, char s[])

  145. {

  146. int deci_sum = 0;


  147. deci_sum = other_scale_to_deci(hex_num, SIXTEEN_SCALE);


  148. return deci_to_other_scale(deci_sum, scale, s);

  149. }


  150. /*********************************************************************************

  151. * Function Name : oct_to_other_scale,八进制转换为其他进制

  152. * Parameter : oct_num:八进制数 scale:进制数 s:保存转换后的数

  153. * Return Value : 0:错误 其他:成功

  154. * Function Explain :

  155. **********************************************************************************/

  156. int oct_to_other_scale(char *oct_num, int scale, char s[])

  157. {

  158. int deci_sum = 0;


  159. deci_sum = other_scale_to_deci(oct_num, EIGHT_SCALE);


  160. return deci_to_other_scale(deci_sum, scale, s);

  161. }


  162. /*********************************************************************************

  163. * Function Name : other_scale_to_deci,其他进制转换为十进制

  164. * Parameter : other_num:其他进制数 scale:进制数

  165. * Return Value : 0:错误 deci_sum:转换成功的十进制数

  166. * Function Explain :

  167. **********************************************************************************/

  168. /*

  169. 如八进制776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510

  170. */

  171. int other_scale_to_deci(char *other_num, int scale)

  172. {

  173. const char figure[] = "0123456789ABCDEF";


  174. char i, j;

  175. char other_len = strlen(other_num), figure_len = strlen(figure);

  176. char deci_num[other_len];

  177. int deci_sum = 0;

  178. char flag = 0;


  179. /* 分离scale进制数的各位,如八进制776分离成7,7,6 */

  180. for ( i = 0; i < other_len; i++ )

  181. {

  182. for ( j = 0; j < scale; j++ )

  183. {

  184. if ( other_num[i] == figure[j] )

  185. {

  186. deci_num[i] = j;

  187. flag = 1;

  188. }


  189. }

  190. /* 不是scale进制数则退出函数 */

  191. if(flag == 0)

  192. {

  193. printf("Input Error!Please Input Again!\n");

  194. return 0;

  195. }

  196. flag = 0;


  197. }


  198. /* scale进制转化为十进制,如八进制转换为十进制数:776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510 */

  199. for ( i = 0; i < other_len; i++ )

  200. {

  201. deci_sum += deci_num[other_len-1-i]*pow(scale, i);

  202. }


  203. return deci_sum;

  204. }


  205. /*********************************************************************************

  206. * 以下是测试函数

  207. **********************************************************************************/

  208. /* 测试十进制转化为其他进制 */

  209. void Test1(void)

  210. {

  211. int num = 0, i = 0;

  212. int scale[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

  213. char buf[32];


  214. printf("Please input a decimalism num : ");

  215. scanf("%d", &num);

  216. for ( i = 0; i < sizeof(scale)/sizeof(scale[0]); i++ )

  217. {

  218. if ( deci_to_other_scale(num, scale[i], buf) )

  219. {

  220. printf("%.2d进制转换:%d = %s\n", scale[i], num, buf);

  221. }

  222. else

  223. {

  224. printf("%.2d进制转换: Error!\n", scale[i]);

  225. }

  226. }

  227. }


  228. /* 测试二进制转化为其他进制 */

  229. void Test2(void)

  230. {

  231. int num = 0, i = 0;

  232. int scale[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

  233. char buf[100], binary_str[100];


  234. printf("Please input a binary num : ");

  235. scanf("%s", binary_str);

  236. for ( i = 0; i < sizeof(scale)/sizeof(scale[0]); i++ )

  237. {

  238. if ( binary_to_other_scale(binary_str, scale[i], buf) )

  239. {

  240. printf("%.2d进制转换:%s = %s\n", scale[i], binary_str, buf);

  241. }

  242. else

  243. {

  244. printf("%.2d进制转换: Error!\n", scale[i]);

  245. }

  246. }

  247. }


  248. /* 测试十六进制转化为其他进制 */

  249. void Test3(void)

  250. {

  251. int i;

  252. int scale[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

  253. char buf[32], hex_str[32];


  254. printf("Please input a hex num : ");

  255. scanf("%s", hex_str);

  256. printf("\n%s\n", hex_str);

  257. for ( i = 0; i < sizeof(scale)/sizeof(scale[0]); i++ )

  258. {

  259. if ( hex_to_other_scale(hex_str, scale[i], buf) )

  260. {

  261. printf("%.2d进制转换:%s = %s\n", scale[i], hex_str, buf);

  262. }

  263. else

  264. {

  265. printf("%.2d进制转换: Error!\n", scale[i]);

  266. }

  267. }

  268. }


  269. /* 测试八进制转化为其他进制 */

  270. void Test4(void)

  271. {

  272. int i;

  273. int scale[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

  274. char buf[32], oct_str[32];


  275. printf("Please input a oct num : ");

  276. scanf("%s", oct_str);

  277. printf("\n%s\n", oct_str);

  278. for ( i = 0; i < sizeof(scale)/sizeof(scale[0]); i++ )

  279. {

  280. if ( oct_to_other_scale(oct_str, scale[i], buf) )

  281. {

  282. printf("%.2d进制转换:%s = %s\n", scale[i], oct_str, buf);

  283. }

  284. else

  285. {

  286. printf("%.2d进制转换: Error!\n", scale[i]);

  287. }

  288. }

  289. }


  290. /* 测试其他进制数转化为十进制数 */

  291. void Test5(void)

  292. {

  293. int scale = 0;

  294. char other_num[32] = {0};

  295. int deci_num = 0;


  296. scanf("%d %s",&scale, other_num);

  297. deci_num = other_scale_to_deci(other_num, scale);

  298. printf("deci_num = %d\n", deci_num);

  299. }

运行结果

转发、点在看就是对小编最大的支持!


博客网站

zhengnianli.github.io


猜你喜欢

C语言每日一练(010)

C语言每日一练(011)

C语言每日一练(012)

C语言每日一练(013)

C语言每日一练(014)

C语言每日一练(015)



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存