题目:
输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。
解答:
#import <Foundation/Foundation.h>
// 打印
void printNum(char *numArray) {
int i = 0;
while (numArray[i] == '0') {
i++;
}
puts(numArray + i);
}
BOOL Increment(char *numArray) {
BOOL isOverflow = FALSE;
int length = strlen(numArray);
int index = 0;
// 将字符 转换 为 整数
for(index = 0; index < length; index++) {
numArray[index] = numArray[index] - '0';
}
// 数组 最后一位 加1
numArray[length - 1]++;
// 判断 每一位 是否 需要 进位 和 最大数 是否 溢出
for (index = length - 1; index >= 0; index--) {
// 需要 进位
if (numArray[index] >= 10) {
// 如果 在 最高位 需要 进位 说明 已经打印完成
if (index == 0) {
isOverflow = YES;
numArray[index]--;
}
// 如果 不是 最高位, 向前进1,取余数
else {
numArray[index] -= 10;
numArray[index - 1] += 1;
}
}
}
// 将整数 转换 为 字符
for(index = 0; index < length; index++) {
numArray[index] = numArray[index] + '0';
}
return isOverflow;
}
// 解法一: 利用循环
void printFromOneToMaxN(int count) {
if(count <= 0) {
return;
}
char *numArray = (char *)malloc((count+1) * sizeof(char));
if (numArray == NULL) {
exit(EXIT_FAILURE);
}
memset(numArray, '0', count * sizeof(char));
numArray[count] = '\0';
while (!Increment(numArray)) {
printNum(numArray);
}
free(numArray);
numArray = NULL;
}
// 解法二: 利用递归
void recursionPrintNum(char *numArray, int length, int index) {
if (index == length) {
printNum(numArray);
return;
}
for (int i = 0; i < 10; i++) {
// 转换 为 整数
numArray[index] = i + '0';
recursionPrintNum(numArray, length, index + 1);
}
}
void recursionPrintSecondFromOneToMaxN(int count) {
if(count <= 0) {
return;
}
char *numArray = (char *)malloc((count+1) * sizeof(char));
if (numArray == NULL) {
exit(EXIT_FAILURE);
}
memset(numArray, '0', count * sizeof(char));
numArray[count] = '\0';
recursionPrintNum(numArray, count, 0);
free(numArray);
numArray = NULL;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int count;
scanf("%d", &count);
recursionPrintSecondFromOneToMaxN(count);
}
return 0;
}
网友评论