一个数与另一个数,如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。
输入格式:
每组数据前有一个N(<1000),表示跟随的整数个数。如果N为0,表示结束输入。
输出格式:
按从小到大的顺序输出非相关数,若没有非相关数,则输出None。
样例">输入样例:
在这里给出一组输入。例如:
8
213 667 3 213 43 34 677 2
3
322 232 232
0
输出样例:
在这里给出相应的输出。例如:
2 3 667 677
None
#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)。
好好生活,保持热爱^_^