剑指Offer之打印1到最大的n位数(题12)
从事成都多线机房,服务器租用,云主机,雅安服务器托管,申请域名,CDN,网络代维等服务。
1 /**************************************** 2 > File Name:test.c 3 > Author:xiaoxiaohui 4 > mail:1924224891@qq.com 5 > Created Time:2016年05月26日 星期四 15时31分00秒 6 ****************************************/ 7 8 9 10 11 12 //此题的关键是解决大数问题,在这里我用字符数组解决大数的存储 13 //在字符数组的最后一位存的是最低位,依次往前推,加1是在最低位加的 14 //当低位为9时,加1会发生进位,所以进到高位时要先加1,所以要设置进位标志 15 //当最高位发生进位时,则表示到了最大的数 16 17 18 #include19 20 void Print(char* buf) 21 { 22 int size = sizeof(buf); 23 24 for(int i = 0; i < size; i++) //使buf指向第一个不为‘0’的字符 25 { 26 if(buf[i] == '0') 27 { 28 buf++; 29 } 30 else 31 { 32 break; 33 } 34 } 35 36 printf("%s\t", buf); 37 } 38 39 int isBiggest(char* buf) 40 { 41 int flog = 0; 42 int size = sizeof(buf); 43 int over_flog = 0; //进位标志 44 int i = 0; 45 46 for(i = size - 1; i >= 0; i--) 47 { 48 int sum = buf[i] - '0' + over_flog; //把最i位的值取出来 49 if(i == size - 1) //当是最低位时,则在这一位上加1 50 { 51 sum += 1; 52 } 53 54 if(sum >= 10) //产生进位 55 { 56 if(i == 0) //当最高位要进位了,就代表已经是最大值了 57 { 58 flog = 1; 59 } 60 else 61 { 62 buf[i] = '0'; //这一位要变为0 63 over_flog = 1; //高一位的要加1 64 } 65 } 66 else //不需要进位 67 { 68 buf[i] = '0' + sum; 69 break; 70 } 71 72 return flog; 73 } 74 } 75 76 77 void PrintToMax(int n) 78 { 79 if(n <= 0) 80 { 81 printf("parameter is error!\n"); 82 return; 83 } 84 85 char* buf = (char*)melloc( (n + 1) * sizeof(char)); 86 memset(buf,'0',sizeof(buf)); 87 buf[n] = '\0'; 88 89 while( !isBiggest(buf)) 90 { 91 Print(buf); 92 } 93 94 free(buf); 95 } 96
1 /**************************************** 2 > File Name:test1.c 3 > Author:xiaoxiaohui 4 > mail:1924224891@qq.com 5 > Created Time:2016年05月26日 星期四 16时44分54秒 6 ****************************************/ 7 8 #include9 10 11 void Print(char* buf) 12 { 13 int size = sizeof(buf); 14 15 for(int i = 0; i < size; i++) //使buf指向第一个不为‘0’的字符 16 { 17 if(buf[i] == '0') 18 { 19 buf++; 20 } 21 else 22 { 23 break; 24 } 25 } 26 27 printf("%s\t", buf); 28 } 29 30 void PrintDigit(char* buf, int length, int index) 31 { 32 if(index == length) 33 { 34 Print(buf); 35 return; 36 } 37 38 for(int i = 0; i < 10; i++) 39 { 40 buf[index] = '0' + i; 41 PrintDigit(buf, length, index + 1); 42 } 43 } 44 45 void PrintToMax(int n) 46 { 47 if(n <= 0) 48 { 49 printf("parameter is error!\n"); 50 return; 51 } 52 53 char* buf = (char*)melloc(size(char) * (n + 1)); 54 memset(buf, '0', sizeof(buf)); 55 buf[n] = '\0'; 56 57 for(int i = 0; i < 10; i++) 58 { 59 PrintDigit(buf, n, 0); 60 } 61 }
新闻名称:剑指Offer之打印1到最大的n位数(题12)
网页网址:http://scyanting.com/article/igpjih.html