美文网首页
【剑指Offer学习】【面试题12:打印1 到最大的n 位数】

【剑指Offer学习】【面试题12:打印1 到最大的n 位数】

作者: 果哥爸 | 来源:发表于2018-01-30 17:00 被阅读65次

    题目:

    输入数字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;
    }
    
    
    

    相关文章

      网友评论

          本文标题:【剑指Offer学习】【面试题12:打印1 到最大的n 位数】

          本文链接:https://www.haomeiwen.com/subject/olrwaxtx.html