该实例要求使用C实现一个无符号整数到[2,16]进制数的转换。这个还是比较好想的,就是对该无符号整数不断的斤进制数d取余数,取商,一直做这样的运算,直到商为0为止,将所有的余数按照从后往前的顺序穿起来,就是转换后的进制数。
下面上我的代码:
~~~
#include <stdio.h>
/**用于声明char数组的长度 **/
#define M (sizeof(unsigned int) * 8)
int trans(unsigned int m,int d,char s[]);
/**
* @brief main 将一个无符号整数转换成任意d进制数(2 << d << 16)
* @return
*/
int main(void)
{
/**
* 思路:将一个无符号整数m转换成任意d进制数,
* 则可以将m除以d,将余数从char数组的最后一位
* 向前保存,同时将商再除以d,以同样的方式进行处理
* 最后得到的数组就是所对应的d进制数
*/
unsigned int m;
printf("Please enter the digits you want to transform:\n");
scanf("%d",&m);
char str[33];
int i = 0;
printf("The translate results are:\n");
for(i = 2;i <= 16;i++){
int nums = trans(m,i,str);
printf("%d = ",m);
int j = 0;
for(j = 0;j < nums;j++){
printf("%c",str[j]);
}
printf("(%d)\n",i);
}
return 0;
}
/**
* @brief trans 用于对无符号整数转换
* @param m 要被转换的数字
* @param d 要被转换成的进制数
* @param s 存放被转换后的进制数的数组
* @return 返回转换后进制数的长度,也就是数组的长度
*/
int trans(unsigned int m,int d,char str[]){
if(d < 2 || d > 16){
//将s置为0
str[0] = '\0';
return 0;
}
/**用于保存进制数 **/
char digits[] = "0123456789ABCDEF";
int i = M;
int j = 0;
char buf[M+1];
/**用于保存商 **/
int s = m;
buf[i] = '\0';
//这里使用do...while
do{
buf[--i] = digits[s % d];
s = s / d;
}while(s);
//对数组s进行赋值
for(j = 0;(str[j]=buf[i])!= '\0';j++,i++);
return j;
}
~~~
下面是我的运行结果截图:
![这里写图片描述](https://box.kancloud.cn/2016-05-24_5743c074e7b62.jpg "")
- 前言
- 实例一:HelloWorld
- scanf函数学习
- 实数比较
- sizeof()保留字获取类型的大小
- 自增/自减学习
- C学习if条件判断和for循环
- C实现的九九乘法表
- C实现一个比较简单的猜数游戏
- 使用C模拟ATM练习switch..case用法
- 记录一个班级的成绩练习一维数组
- C数组实现矩阵的转置
- C二维数组练习
- 利用数组求前n个质数
- C实现万年历
- C实现数组中元素的排序
- C实现任意进制数的转化
- C判断一个正整数n的d进制数是否是回文数
- C使用递归实现前N个元素的和
- 钢材切割问题
- 使用指针比较整型数据的大小
- 指向数组的指针
- 寻找指定元素
- 寻找相同元素的指针
- 整数转换成罗马数字
- 字符替换
- 从键盘读入实数
- C实现字符行排版
- C实现字符排列
- C实例--判断一个字符串是否是回文数
- 通讯录的输入输出
- 扑克牌的结构定义
- 使用“结构”统计学生成绩
- 报数游戏
- 模拟社会关系
- 统计文件中字符个数
- C实现两个文件的内容输出到同一个屏幕