[笔记]一道C语言面试题:得到整数的M进制表示字符串

题目:输入整数n和M,输出n在M进制下的表示字符串。如n=3000,M=16,输出16进制下3000的表示字符串,为“BB8”

来源:某500强企业面试题目

思路:对n取模M,将得到的数字压入栈中,再令 n = n / M 的商。重复这一过程,可以得到每一位的数字。

将栈内的数字出栈,并转为字符表达,凑成完整的字符串即可

#include "stdio.h"

#include "stdlib.h"

#include "string.h"



//----------------------------------------

// 将n用M进制表示并输出

//----------------------------------------

#define MAX_NUM 1024

char *M_Ary(int n, int M) {

  int Ary[MAX_NUM] = {0};

  char *str = 0;

  int i = 0;

  int a = 0;

  int b = 0;

  int c = 0;

  int num = 0;



  

  i = 0;

  a = n;

  while (a >= M) {              // 反复取余,放入Ary数组中

    b = a % M;                  // 取余数

    a = a / M;                  // 取商

    Ary[i] = b;

    i++;

    

    if (i > MAX_NUM-1) return 0;// 如果越界,返回NULL

  }

  Ary[i] = a;



  num = i + 1;                  // 获得数组长度

  str = (char*)malloc(num + 1); // 创建字符串

  if (!str) return 0;           // 如果创建失败,返回NULL



  memset(str, 0, num + 1);      // 清空字符串



  for (i = 0; i < num; i++) {   // 倒序将Ary数组的数字放入str中

    c = Ary[num - i - 1];

    if (c < 10) {      

      str[i] = '0' + c;         // 如果是 0-9,则输出数字

    } else {      

      str[i] = 'A' + (c - 10);  // 如果是 > 10,则输出A-Z

    }

  }



  return str;

}



//-------------------------------------------------------------------------



void TestM_Ary(void) {

  int n, M;

  char *str = 0;



  n = 10;

  M = 2;

  str = M_Ary(n, M);

  printf("M_Ary(%d, %d) = %s\n", n, M, str);

  free(str);



  n = 100;

  M = 8;

  str = M_Ary(n, M);

  printf("M_Ary(%d, %d) = %s\n", n, M, str);

  free(str);



  n = 3000;

  M = 16;

  str = M_Ary(n, M);

  printf("M_Ary(%d, %d) = %s\n", n, M, str);

  free(str);

}



//-------------------------------------------------------------------------



int main(int argc, char *argv[]) {

  TestM_Ary();



  getchar();

  return 0;

}
Technorati 标签: ,

你可能感兴趣的:(字符串)