题目:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
首先:
1,30位数字的十进制,并没有一个数据类型可以存下30位的整数类型数字,所以考虑用字符串存储这个数据,遍历这个字符串,每个数获取就是字符的值减去30(‘0’)
2,30位的整数数字转化为二进制更加的长,所以也用十进制输出
3,输出的时候,用栈的思想进行输出
下面是我的代码,因为学习不久,完全按照栈的方法进行使用,以后要学会灵活运用思想:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<ctype.h> 4 #include<string.h> 5 #define STACK_INIT_SIZE 100 6 #define STACK_INCRECEMENT 10 7 8 typedef struct{ 9 int *top; 10 int *base; 11 int stacksize; 12 }Stack; 13 14 int Stack_init(Stack *s){ 15 s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); 16 if(s->base==NULL){ 17 return 0; 18 } 19 s->top=s->base; 20 s->stacksize=STACK_INIT_SIZE; 21 return 1; 22 } 23 int Push(Stack *s,int element){ 24 25 if(s->top-s->base>=s->stacksize){ 26 s->base=(int *)realloc(s->base,(s->stacksize+STACK_INCRECEMENT)*sizeof(int)); 27 if(s->base==NULL) 28 exit (0); 29 s->top=s->base+s->stacksize; 30 s->stacksize+=STACK_INCRECEMENT; 31 } 32 *(s->top)=element; 33 *(s->top)++; 34 return 1; 35 } 36 37 int Pop(Stack *s,int* element){ 38 39 if(s->base==s->top){ 40 return 0; 41 } 42 *element=*--(s->top); 43 return 1; 44 } 45 46 bool judgeFinal(int number[],int size){ 47 for(int i=0;i<size;i++){ 48 if(number[i]!=0){ 49 return false; 50 } 51 } 52 return true; 53 } 54 55 int main(){ 56 57 Stack s; 58 int initResult=Stack_init(&s); 59 if(initResult==0){ 60 printf("Stack Init Fail!!"); 61 } 62 int intNum[30]; 63 char charNumber[30]; 64 int number=0; 65 66 scanf("%s",charNumber); 67 int size=strlen(charNumber); 68 while(number<size){ 69 intNum[number]=charNumber[number]-'0'; 70 number++; 71 } 72 /*printf("Input number is:%s ",charNumber); 73 for(int i=0;i<size;i++){ 74 printf("int array:%d ",intNum[i]); 75 }*/ 76 while(!judgeFinal(intNum,size)){ 77 int remain=0;
//获得二进制的过程 78 for(int k=0;k<size;k++){ 79 int tempRemain=(intNum[k]+10*remain)%2; 80 intNum[k]=(intNum[k]+10*remain)/2; 81 remain=tempRemain; 82 } 83 Push(&s,remain); 84 } 85 int tempNum; 86 while(Pop(&s,&tempNum)){ 87 printf("%d",tempNum); 88 } 89 printf(" "); 90 return 0; 91 } 92 93