打印1到最大的n位数——12

输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3...一直到最大的3位数即999。

其实一看这个题,就可以想到用一个循环来打印,循环次数就为10的n次方减一,即输入3循环999次依次打印出所对应的值。但是,有一个重要的点就是,如果n的值很大,大到溢出了所能表示的最大整型范围的值,比如用long long数据类型都存放不下了要怎么办呢?这就可以考虑,用字符串的形式来表达大数据,反正只是说让打印出来;

程序设计如下:

#include <iostream>
#include <string.h>
using namespace std;

void PrintMaxNNum(size_t n)
{
    char *num = new char[n+1];//最后一个字符存放‘\0‘

    char* tmp = num;
    while(tmp < num+n)//初始化字符串将其全部设置为0
    {   
        *tmp = ‘0‘;
        ++tmp;
    }   

    *(tmp--) = ‘\0‘;//使tmp指向最后一个有效字符

    char *cur = tmp;
    
    while(cur >= num)
    {   
        while(*tmp < ‘9‘)//tmp始终在最后一位进行加1并输出
        {
            ++(*tmp);
            cout<<cur<<" ";
        }
        *tmp = ‘0‘;//当循环结束时tmp恢复为0并且要向高位进位

        for(int i = 1; cur >= num; ++i)//用循环来完成在cur到tmp的期间字符表示数字的进位
        {
            if((tmp-i) < cur)//当要进的位数不够当前cur所能表示的范围时将cur范围扩大
                --cur;
            if(cur >= num)
            {
                ++(*(tmp-i));//进位
                if(*(tmp-i) <= ‘9‘)//若进位后不需要再向前进位,则输出并break重新回到最低位
                {
                    cout<<cur<<" ";
                    break;
                }
                else//否则向再高位依次进位
                {
                    *(tmp-i) = ‘0‘;
                    continue;
                }
            }
        }
    }
    cout<<endl;
    delete[] num;
}

int main()
{
    size_t n = 3;
    PrintMaxNNum(n);
    return 0;
}

初步的思想就是用两个指针表示数字的范围,一个tmp指针始终处在最低位加1,当需要进位时不停地往cur的方向进位,直到cur超出字符串的范围;

运行程序:

这数字已经够密密麻麻的了,如果设置再大一些比如超出系统数据类型所能表示范围的位数,运算都要耗费些时间,这里就不设置验证了。

《完》

时间: 2024-12-31 13:14:23

打印1到最大的n位数——12的相关文章

打印1到最大的n位数 12

两种解法,一种递归,一种判断该数加1是否最高位进1 ? ? 第二种较简单 ? ? 主要两个函数,一个是打印数字,要求判断该数字是否是第一个不为零的数字,然后后面的依次打出即可 ? ? 第二个函数是对一个数加1判断加1之后的数是否使得最高位进位 ? ? 初始化长度为n的字符数组,即初始0,对该数实现字符上的加1,如果一直没进位,则打印该数,如果进位,则退出循环 ? ? 第二种利用递归,全排列的思想 ? ? 从左到右,由高位开始,0到9排列,0的情况递归到深一层,继续0到9 ? ? 递归结束的条件是

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

数据结构-打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 分析:本题最关键的部分是当n值非常大的时候会超出数据类型的范围.偷个懒,没有实现打印1,2,3....999.可以利用分割把string分割成char[].然后单个的char转为int再进行加减法,作为输出. /* 剑指offer面试题12 该问题主要考虑到数据非常大超出数据类型的范围 */ #include <iostream> #include <cstring>

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

【C语言】打印1到最大的n位数

//打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数.比如:输入3,则打印出1.2一直到最大的3位数999 #include <stdio.h> #include <stdlib.h> #include <memory.h> int num[10]; int add(int n) { int isoverflow = 0; int carry = 0; int i; for (i = 9; i >= 10 - n; i--) { num[

打印1到最大的n位数----java实现

题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999. 分析: 1.这是一个典型的大数加法问题,无论是int还是long long类型多无法表示.所以在解决大数问题时,通常是使用字符串或者数组实现其功能(由于个人比较钟爱数组,所以下面代码是使用数组实现的). 2.在大数的加法中,我们需要注意的问题是进位问题. 3.在该题中还需要判断是否为最大的n位整数.这里需要一个小技巧,我们只需判断最高位(第n位)是否要进位,如果需进

面试题17:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. 解题思路: 首先是一个大陷阱,n有多大?万一大到long long类型都盛不下,你要直接动手写,那写的再正确也是凉凉. 我们考虑到用字符来表示数字,然后把字符打印出来就行了. 书上巴拉巴拉说了一种很复杂的方法,代码量大也比较繁琐,感兴趣的去参考资料看就行了. 这里直接介绍第二种简单的方法,其实打印出从1最大的n位十进制数,实际就是

《剑指offer》第十七题:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <cstdio> #include <memory> void PrintNumber(char* number); bool Increment(char* number); void Print1ToMaxOfNDigitsRecursively(char* number, int length

12:打印 1 到最大的 n 位数

题目:输入数字 n.按顺序打印出从 1 到 最大的 n 位十进制数.比方输入 3 ,则打印出 1.2 .3 一直到最大的3位数即 999. 解析: easy知道不能用 int 等数字类型表示(大数问题) 在字符串上模拟数字加法 关键点: 1. 怎样用字符串表示n位数? 2. 怎样实现字符串数的自增操作? 3. 怎样打印一个字符串数? - 申请长度是n+1的字符数组number. number[0] 是最高位, number[n-1]最低位, number[n] = '\0' - 首先把字符串中的