C实现任意进制数的转化

该实例要求使用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;
}

下面是我的运行结果截图:

时间: 2024-11-09 02:01:49

C实现任意进制数的转化的相关文章

任意进制数的加法

实现一个2-35位任意进制的加法.输入有整型表示进制是多少:两个需要相加的字符串.对于不合法的输入输出-1. 比如: 20 jj 10 10j 30 gggt 1 ggh0 程序实现如下: 1 #include <string> 2 #include <iostream> 3 4 #define MAX_NUM 100000 //最多这么多位字符.发现再多的话程序崩溃 5 using namespace std; 6 7 void reversal(string &s,un

十进制转任意进制数

//十进制转任意进制 #include <iostream> #include <stack> using namespace std; int main() { int T; int n, a, p; cin >> T; while (T--) { stack<int> s; //n 为十进制,p为要转换的进制 cin >> n >> p; while (n) { a = n % p; s.push(a); n /= p; } wh

C++实现将十进制数转换为小于等于九的任意进制

//十进制转换为小于等于九的任意进制数 #include<iostream> #include<string> #include<stack> using namespace std; stack<int> num; void change(int N,int M) { if(N<0||M<=1) { cout<<"error!"<<endl; return; } while(N>0) { num

Python版任意进制转换

def decimalToAny(num,n): baseStr = {10:"a",11:"b",12:"c",13:"d",14:"e",15:"f",16:"g",17:"h",18:"i",19:"j"} new_num_str = "" while num != 0: remai

[NOIP2006] 提高组 洛谷P1066 2^k进制数

题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W< span>≤30000)是事先给定的. 问:满足上述条件的不同的r共有多少个? 我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q.将S从右起划分为

递归 将一个十进制数转化为任意进制字符串

Create All kinds of guns. 设计重点: 1 基类作接口 2 继承类是各种不同的类 3 构建工厂类,然后根据需要创造不同的类,可以传入关键字,或者索引等. #pragma once #include <string> #include <iostream> using namespace std; //Base class class Gun { public: virtual string description() { return "Gener

ASCII码转化16进制数

//将ASCII码转化为16进制数 if((ch>='0')&&(ch<='9'))        return ch-0x30;     else if((ch>='A')&&(ch<='F'))        return ch-'A'+10;     else if((ch>='a')&&(ch<='f'))        return ch-'a'+10;             else        retur

C语言-对字符串二维数组各个元素进行比较-十进制数转化为其他进制数-进行规则矩阵的输出-190225

//编写一个函数:从传入的num个字符中找到最长的一个字符,并通过max传回该串地址. //重点:切记这里a[0]就是一个地址. 1 #include<conio.h> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 char *fun(char (*a)[81], int num, char *max) 7 { 8 max = a[0];//切记这里a[0]就是一个地址.

java 的任意进制间转换

直接上代码: public class Main { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("十进制转换到其它进制:"); int x = 123 ; String str1 = Integer.toHexString(x) ; ///10进制转换成16进制的字符串 System.out.println(str1); String st