在网上并没有找到这个题目的c++解答,c倒是有不少,借鉴了一下之后先把自己写的贴出来
「不过莫名过不了学校的OJ。。。。提示格式错误尝试多次放弃了= =」
「路过的各位大佬有看出来的可以帮忙指点一下咩orz」
#include <iostream>
using namespace std;
void sort(int array1[],int n)
{
int param=0;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(array1[i]<array1[j])
{
param=array1[i];
array1[i]=array1[j];
array1[j]=param;
}
}
}
}
int max(int num)
{
int array2[10]={0},n=0;
while(num!=0)
{
array2[n]=num%10;
n++;
num/=10;
}
sort(array2,n);
for(int i=n-1;i>=0;i--)
num=num*10+array2[i];
return num;
}
int main() {
int param1,num[10]={0},flag[10]={1},param2,param3=0;
while (cin>>param1)
{
if(param1==0)
return 0;
int temp[10]={0};
for(int n=0;n<param1;n++)
{
cin>>num[n];
temp[n]=max(num[n]);
flag[n]=0;
}
for(int i=0;i<param1-1;i++)
{
for (int j=i+1;j<param1;j++)
{
if(num[i]>num[j])
{
param2=num[i];
num[i]=num[j];
num[j]=param2;
param2=flag[i];
flag[i]=flag[j];
flag[j]=param2;
param2=temp[i];
temp[i]=temp[j];
temp[j]=param2;
}
if(temp[i]==temp[j])
{
flag[i]=1;
flag[j]=1;
continue;
}
}
}
for( int m=0;m<param1;m++){
if(flag[m]==0){
if(m!=0)cout<<" ";
cout<<num[m];
param3++;
}
}
if(param3==0)
cout<<"None";
cout<<endl;
param3=0;
}
}
在论坛上看过某位大佬的思路之后尝试自己用C++写了一遍唔。 。。。不得不说大佬还是大佬有几个地方的处理我心服口服
首先是flag数组,用这个来标志是否重复同时控制输出的感觉实在是太赞了
再就是检索关系数的算法,,,自愧不如,主题函数的部分是我自己写的,在写的时候才意识到把输入放入num中可以通过同一个角标一方面用temp检索是否相关,另一方面用num排序「这里之所以不用temp排序是担心存在765和677这样的相关数出现,毕竟输出还是得输出原来的输入数据」,最后用flag数组调控是否输出
//以下吐槽区
唔。。。怎么说在准备做这道题目的时候我第一时间否决了在两个数进行相关性查找的时候采用数组进行逐个查找的方法「才不是因为懒哼」
看到一种可行的方法是将数字将十进制位放到数组num中,对数组中的元素进行排序,之后再将数组转化为整形数据存到一个新的数组temp中,然后进行检索是否重复
//哇虽然不想承认但是这个方法确实已经是最简单的方法了
详见该帖子六楼大佬
但是我一开始的想法是选取多个数组存放输入的数据
然后构建一个由指向数组的指针的数组
http://blog.csdn.net/kaiming2008/article/details/5617155/
这位大佬的帖子给了我可信的信心「个鬼啊」
妈耶看完楼上的算法根本不想写了好吗耗时耗内存
好吧毕竟是自己的想法多少还是得尊重一下的
另一个方法是构建多个数组但是并不通过指针将它们串在一个数组里
通过在代码最后一个元素标注序号来区分不同的输入「有用才怪」
经过仔细考虑之后发现这些都是难以实现的
因为在循环输入之中每一次输入都意味着需要重新建立一次数组,将多次输入的数据通过不同的数组储存的实现方法我还没想出来= =
但是有一个办法也就是将数据处理好之后混入一个空间比较大的数组当中,但是这样的话一来比较的事宜相比还是十分的麻烦,而且在空间比较大的数组当中如何划分区域也是一个十分困难的事情
还有怎么都过不了的oj= =「残念」
还有崩得一塌糊涂的oj服务器
大脑。。。在颤抖