打印1到最大的n位数

来源:互联网 发布:香港理工大学知乎 编辑:程序博客网 时间:2024/05/21 22:52

题目: 输入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[n] = '\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");
}


0 0
原创粉丝点击