您的位置:首页 > 其它

打印1到最大的n位数

2016-09-17 14:26 274 查看
题目: 输入2    则输出1~99     输入3   则输出1~999

思路:  属于大数问题,因为输出的n一大,则特别容易出现溢出问题,即超出long long可表示的范围。

             所以用一般的思路:   根据n的位数,先求出最大的值,接着遍历。  是不符合要求的

             新思路:  将n位的每一位看成是一个字符, 输出的数字只是n位字符的全排列。 比如数字34,只是理解为  char   num[3] = "34";

代码:

#include <iostream>

#include <vector>

#include <string>

using namespace std;

void PrintfOut(char *strnum) //最高位的‘0’不打印出来

{

    int len = strlen(strnum);

    bool iszero = true;

    for (int i = 0; i < len; ++i)

    {

        if (iszero && strnum[i]!='0')

        {

            iszero = false;

        }

        if (!iszero)

        {

            cout << strnum[i];

        }

    }

    if (!iszero)

        cout << '\t';

}

void Func2(char *strnum, int length, int index)

{

    if (index == length-1)   //递归终止条件

    {

        PrintfOut(strnum);

        return;

    }

    for (int i = 0; i < 10; ++i)

    {

        strnum[index+1] = i + '0';

        Func2(strnum, length, index+1);

    }

}

void Func(int n)

{

    char *strnum = new char[n+1];

    memset(strnum, '0', n+1);

    strnum
= '\0';

    for (int i = 0; i < 10; ++i)

    {

        strnum[0] = i + '0';          //最高位从'0'到'9'

        Func2(strnum, n, 0);

    }

}

int main()

{

    int num;

    cin >> num;

    Func(num);

    system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: