/* 1.打印1到最大的n位数。 题目:输入数字n,按顺序打印出从1到最大的n位十进制数。 比如:输入3,则打印出1、2、3一直到最大的3位数999. [陷阱]:这个题目很容易想到的办法就是先求出最大的数。 然后循环输出就可以了。 */ #include<stdio.h>//自己想到的方法,从a[0]-a[n]依次输出每一位,一次只输出某一位的某个数字 int main() { int i = 0,j = 0,k = 0,input=3;//i为控制进位 j为每一位输出(个位,十位等) //k为循环进位,input 为最大输出数 char a[] = "100000000";//模拟进位的储存器 while (j < input)//判断是否结束 { while (j >= 0)//控制输出某位 { printf("%c",a[j]);//输出一位数字 if (j == 0) //j==0时为个位 依次累加位数 { if (a[j] == ‘9‘)//个位为9进位 { for (k = 0; k < input;)//是否多次进位 { if (a[k+1]<‘9‘) { a[k + 1]++; a[k] = ‘0‘; if (a[k + 1] == ‘1‘&&i<k+1) i++;//开辟新的位数 break; } else { a[k] = ‘0‘;//个位制零 k++; } } } else a[0]++;//个位自加 } j--;//j 从高位 依次减少 } printf(" "); //分割 每个数字 j = i;//让j为现在的最高位 例如:9 之后 10 j=i=1; } return 0; } #include<stdio.h> #include<string.h> #include<assert.h> int add_num(char *arr,int num,int end)//网上一般逻辑模拟数字累加程序(稍微不同) { //num 输出位数n end 模拟空间最大值 assert(arr); int is_carry = 0;//是否进位 int is_over = 1;//是否超过与溢出 int i = end-1; char *arr1 = arr; if (arr1[i] != 9) { arr1[i]++; } else { is_carry = 1; arr[i] = 0; while (1) { if (end-1 - (i - 1) >= num || i == 0) { printf("\n **** 输出结束! ****\n"); is_over = 0; return is_over; } if (arr1[--i] != 9) { arr1[i] += is_carry; is_carry = 0; break; } else { arr1[i] = 0; } } } } void show_num(char *arr,int num)//按位输出 { int is_high = 0; while (num>0) { if (*arr == 0&&is_high==0) arr++; else { printf("%d",(int)*arr++); is_high = 1; } num--; } printf(" "); } int main() { char num[11] = { ‘\0‘ }; while (add_num(num, 3,11)) { show_num(num,11); } return 0; }
原文:http://shaungqiran.blog.51cto.com/10532904/1696355