題目:將一個長度最多為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\n",charNumber); 73 for(int i=0;i<size;i++){ 74 printf("int array:%d\n",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("\n"); 90 return 0; 91 } 92 93