51NOD-n位不重复的数字

今天的数学课让你感到很无聊。于是你打算在纸上写下所有n位不含重复数字的数,来打发时间。
例如:你打算写6位数,那么你会写下127643;而123347含重复的3,你不会写下它。
你决定由小到大写出每个数,并且你不会考虑含前导0的n位数。
输入
输入一个数n,表示你打算写n位数。
输出
每行输出一个数,表示你所写下的n位数。
数据范围
对于100%的数据,1≤n≤8;
输入样例
1
输出样例
1
2
3
4
5
6
7
8
9

解题思路:
1.遍历所有n位数
2.对n位数的各位进行查重,可以将这个数的各位放到一个数组里进行查重
3.输出无重复元素的数组对应的那个n位数

参考代码:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n=0;
    cin>>n;
    int* a=new int[n]; //申请长度为n的动态数组用来存放n位数的各位
    for(int i=pow(10,n-1); i<pow(10,n); i++) //遍历所有n位数
    {
        int x=i,j=0,flag=1;
        while(x>0) //将这个n位数的各位拆分至数组a中
        {
            a[j]=x%10;
            x=x/10;
            j++;
        }
        for(int k=1; k<j; k++) //对数组a的所有元素进行查重
        {
            for(int m=0; m<k; m++)
            {
                if(a[m]==a[k])
                    flag=0;
            }
        }
        if(flag==1) //如果flag的值仍为1,说明数组a没有重复元素,所以输出i
            cout<<i<<endl;;
    }
    return 0;
}

试试这个:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n=0;
    cin>>n;
    for(int i=pow(10,n-1); i<pow(10,n); i++) //遍历所有n位数
    {
        int arr[10]={0};
        int index=0,num=i,flag=1;
        while (num>0)
        {
            index = num % 10;
            if (arr[index])
                flag=0;
            arr[index] = 1;
            num /= 10;
        }
        if(flag==1)
            cout<<i<<endl;
    }
    return 0;
}

快来试试这样:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n=0;
    cin>>n;
    for(int i=pow(10,n-1); i<pow(10,n); i++) //遍历所有n位数
    {
        int arr[10]= {0};
        int index=0,num=i,flag=1;
        while (num>0)
        {
            index = num % 10;
            if (arr[index])
            {
                flag=0;
                break;
            }
            arr[index] = 1;
            num /= 10;
        }
        if(flag)
            cout<<i<<endl;
    }
    return 0;
}

用C风格的输出试试:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int n=0,a=0,b=0;
    scanf("%d",&n);
    if(n==1)
        a=1,b=9;
    if(n==2)
        a=10,b=98;
    if(n==3)
        a=102,b=987;
    if(n==4)
        a=1023,b=9876;
    if(n==5)
        a=10234,b=98765;
    if(n==6)
        a=102345,b=987654;
    if(n==7)
        a=1023456,b=9876543;
    if(n==8)
        a=10234567,b=98765432;
    for(int i=a; i<=b; i++) //遍历所有n位数
    {
        int arr[10]= {0};
        int index=0,num=i,flag=1;
        while (num>0)
        {
            index = num % 10;
            if (arr[index])
            {
                flag=0;
                break;
            }
            arr[index] = 1;
            num /= 10;
        }
        if(flag)
            printf("%d\n",i);
    }
    return 0;
}

能优化一下吗

使用#include <bits/stdc++.h>头文件

能改成最便捷的吗

不知道为啥又超时

这样肯定能过!

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n=0,a=1,b=10;
    cin>>n;
    n--;
    while(n--)
    {
        a*=10;
        b*=10;
    }
    for(int i=a; i<b; i++) //遍历所有n位数
    {
        int arr[10]= {0};
        int index=0,num=i,flag=1;
        while (num>0)
        {
            index = num % 10;
            if (arr[index])
            {
                flag=0;
                break;
            }
            arr[index] = 1;
            num /= 10;
        }
        if(flag)
            cout<<i<<endl;
    }
    return 0;
}

这样:

#include <iostream>
using namespace std;
int main()
{
    int n=0,a=0,b=0;
    cin>>n;
    if(n==1)
        a=1,b=9;
    if(n==2)
        a=10,b=98;
    if(n==3)
        a=102,b=987;
    if(n==4)
        a=1023,b=9876;
    if(n==5)
        a=10234,b=98765;
    if(n==6)
        a=102345,b=987654;
    if(n==7)
        a=1023456,b=9876543;
    if(n==8)
        a=10234567,b=98765432;

    for(int i=a; i<=b; i++) //遍历所有n位数
    {
        int arr[10]= {0};
        int index=0,num=i,flag=1;
        while (num>0)
        {
            index = num % 10;
            if (arr[index])
            {
                flag=0;
                break;
            }
            arr[index] = 1;
            num /= 10;
        }
        if(flag)
            cout<<i<<endl;
    }
    return 0;
}