C语言的进制转换相关问题的解答

img


这一个黄色行的输出为什么是10,12,a 啊?10的8进制是12啊?求详细解答

16进制一共有16个基数 0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F。 A对应10进制的10 B对应10进制的11 C对应10进制的12 D对应10进制的13 E对应10进制的14 F对应10进制的15。
这是案例

img

对啊, %d 输出十进制的, %o输出 八进制的,%x输出十六进制的

10,12,a
i=1
A

1 %d十进制 %o 八进制 %x 是16进制
2 i++ 后置自增 先打印再自增 所以为 1
3 i等于j 打印A 不然打印 B , 此时前一句已经自增完成,所以相同 打印A

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7608748
  • 这篇博客也不错, 你可以看下编写一个算法,将非负的十进制整数转换为其他进制的数输出,10及其以上的数字从‘A’开始的字母表示。
  • 除此之外, 这篇博客: 用C语言完整实现12种排序方法中的 10.计数排序 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 思路:这是一种基于比较的算法,我们用一个大数组来存放这些数据,这些数据在这个大数组中的表现形式是以这个大数组的下标存在的,比如57,60,42这三个数字进行排序,那么用一个大数组,这个大数组的arr[57] = 1,arr[60] = 1,arr[42] = 1,然后遍历这个大数组就行了。

    • 时间复杂度:O(n+k),其中这个k为数据的范围,所以计数排序最适合数据比较集中的数组排序。
    • 稳定性:稳定的算法
      代码实现:
    void count_sort(int arr[],size_t len){
    	int max = arr[0];	//最大值
    	int min = arr[0];	//最小值
    	size_t i;
    	for(i=0;i<len;i++){
    		if(max<arr[i]){	//找到最大值
    			max =arr[i];	
    		}
    		if(min > arr[i]){	//找到最小值
    			min = arr[i];	
    		}
    	}
    	int cnt = max-min+1;		//范围
    	int *prr = malloc(cnt*sizeof(int));	//申请临时空间
    	for(i=0;i<cnt;i++){	//这个临时数组全部置0
    		prr[i] = 0;	
    	}
    	for(i=0;i<len;i++){	//对需要进行排序的序列进行遍历
    		prr[arr[i]-min]++;		//让下标为(arr[i]-min)的临时大数组的值+1
    	}
    	size_t j=0;
    	for(i=0;i<cnt;i++){	//遍历这个临时数组
    		while(prr[i]){	//如果这个数组下标为i的值不等于0
    			arr[j++] = i+min;	//那就让需要进行排序的数组的值为i+min;
    			--prr[i];
    		}	
    	}
    	free(prr);		//释放掉申请的动态内存
    }
    

字符:o 对应数据类型:unsigned int,无符号8进制(octal)整数 示例:printf(“0%o”,123);输出0173
字符:x/X 对应数据类型:无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF 示例:printf(“0x%x 0x%X”,123,123);输出0x7b 0x7B