剔除相关数(c++)

一个数与另一个数,如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。

输入格式:

每组数据前有一个N(<1000),表示跟随的整数个数。如果N为0,表示结束输入。

输出格式:

按从小到大的顺序输出非相关数,若没有非相关数,则输出None。

样例">输入样例:

在这里给出一组输入。例如:

8
213 667 3 213 43 34 677 2
3
322 232 232
0

输出样例:

在这里给出相应的输出。例如:

2 3 667 677
None

5840aa93153e42679336c6340ea4255f.png

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main()
{
    int n;
    while (cin >> n && n != 0)
    {
        int mark[99999] = { 0 };
        string str[n];//最原始的数字,用于最后输出
        string str1[n];//将字符串(每个数字)储存在str1中进行从大到小的排序
        int num[n] = { 0 };
        for (int i = 0; i < n; i++)
        {
            cin >> str[i];
            str1[i] = str[i];
            for (int k = 0; k < str[i].length() - 1; k++)//将数字按从大到小排序(如232,233都排成了322)
            {
                for (int j = 0; j < str[i].length() - 1 - k; j++)//将所有数字string按从小到达排列
                    if (str1[i][j + 1] > str1[i][j])
                    {
                        char temp = str1[i][j + 1];
                        str1[i][j + 1] = str1[i][j];
                        str1[i][j] = temp;
                    }
            }//注意不能从小到大(比如:101和1001,排序之后数字的大小都是11),无法判断位数

            int power = 1;
            for (int j = str1[i].length() - 1; j >= 0; j--)
            {
                num[i] += (str1[i][j] - '0') * power;
                power *= 10;
            }
        }
        for (int i = 0; i < n; i++)//遍历排序后的每个数字
        {
            for (int j = 0; j < n; j++)//将其和数组中每个数字比较
            {
                if (num[i] == num[j])
                    mark[num[i]]++;//相等就标记+1
            }
        }
        int count = 0, result[n] = { 0 };
        for (int i = 0; i < n; i++)
        {
            if (mark[num[i]] == 1)//只有本身(即只出现一次)
            {
                int power = 1;
                for (int j = str[i].length() - 1; j >= 0; j--)
                {
                    result[count] += (str[i][j] - '0') * power;
                    power *= 10;
                }
                count++;
            }
        }
        sort(result, result + count);
        if (count)
        {
            for (int i = 0; i < count - 1; i++) cout << result[i] << " ";
            cout << result[count - 1] << endl;
        }
        else cout << "None" << endl;

    }
    return 0;
}

         将所有数字里每一位从大到小排序,形成新的数字(比如132和321都排成了321,再用循环将字符串转化成对应的整型数字,这样就可以判断是不是相关数了)。

        切记不能反过来思考,将其增序排列,那样零放在前面就看不出位数了(比如1000,100,10,排序后对应的整型数字都是1)。

        好好生活,保持热爱^_^

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值