10进制转换2-36进制
加上注释了,其实比较悲剧的是,到最后我想找一下有没有更好的整数转字符串的方法,然后搜索到了itoa....然后我就崩溃了里面还有很多调试用的printf没删,其实过程中遇到很多哭笑不得的错误,刚开始是我先除了而不是先求余,然后测试的时候输入了10 2 output函数输出0101, 用printf得知从num函数返回之后save是1010.我还以为不应该倒序输出,但是输入其他的又不对,然后被自己误导了半天,笔算了半天,才发现我是先除了.
PS:新手练手.
另外求个新手学习群...
再问下各位大大有没有更好的思路
明天试试n转n看看
程序代码:
#include <stdio.h> #include <stdlib.h> void num(int ,int ,char * ,int * ); void savenum(char * , int , int * ); void output(char * , int ); int main(void) { char save[16]={0}; /*初始化*/ int inputnum,jz; int use = 0; /*记录数组使用位置*/ printf("请输入需要转换的数字"); scanf("%d",&inputnum); printf("请输入需要转换的进制(2-36):"); scanf("%d", &jz); while (36 < jz || 2 > jz) /*检测是否超出上限*/ { printf("超出限制,请重新输入\n"); scanf("%d", &jz); } num(inputnum,jz,save,&use); output(save,16); // itoa(inputnum,save,jz); // printf("%s",save); return 0; } void num(int input,int injz,char * temp,int * use) { int tempmod; // printf("进入num函数,input = %d, injz = %d, temp = %s, use = %d\n",input ,injz ,temp ,*use ); while(1) /*无限循环*/ { tempmod = input % injz; /*先求余,否则会丢失一位数*/ input = input / injz; savenum(temp,tempmod,use); // printf("已从savenum函数返回\n"); if (input == 0) /*检测输入的数字是否已除至0,是则退出循环*/ break; else ; } return ; } void savenum(char * temp , int t, int * use) { if (10 > t) /*如果t小于10则加48,对应ASCII中0-9的编码*/ t = t + 48; else /*否则则加55,对应ASCII中A-Z的编码*/ t = t + 55; temp[* use] = t; /*赋值*/ * use = * use + 1; /*使main中的use变量加1,已避免操作了已经赋值的字符数组空间*/ return ; } void output(char * temp , int t) { int i; t = t - 1; /*因为数组下标从0开始,所以减一,使上面输入更方便*/ // printf("进入output函数,接收到的数据为 temp = %s,t = %d\n", temp , t); for(i=t;i>=0;--i) /*倒序输出*/ { // printf("第[%d]次\n", i); if (temp[i] != 0) /*只输出非空字符*/ printf("%c", temp[i]); } printf("\n"); return ; }
[ 本帖最后由 随风飘荡 于 2011-10-29 02:07 编辑 ]