Mister-小方


私信TA

用户名:1104986125

访问量:92759

签 名:

如此英俊为哪般

等  级
排  名 4
经  验 16509
参赛次数 1
文章发表 68
年  龄 19
在职情况
学  校 大连交通大学
专  业 车辆工程

  自我简介:

解题思路:
如何判断2个数相关是关键:   对一个数如果把其中的数字由大到小排列.如1345 排成5431
                                                                                                            4135 排成5431
如果排列后的两个数相等,那么两个数相关.(很精妙)
所以对本题:
(1)把输入的数从小到大排列(方便比较,但我感觉不排也无所谓)
(2)把每个数中的数字按从大到小排列.如223 变为322(关键就是这步和下一步)
(2)两两比较是否相关,也就是比较是否相等.

参考代码:

#include <stdio.h>
#include <math.h>
#define N 1000
#define M 10

void Sort(unsigned int *a, int n)  //对全部的数按大小重排列
{
int i, j, k, t;
for (i = 0; i < n-1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
if(a[j] < a[k])
k = j;
t = a[k];
a[k] = a[i];
a[i] = t;
}
}

unsigned max(unsigned int num)   将一个数从大到小,重排(改变一个数)
{
int index = 0 , i;
unsigned int sum = 0, digit[M];

while (num != 0)
{
digit[index++] = num % 10;
num = num / 10;
}
Sort(digit, index);
for (i = index - 1; i >= 0; i--)
sum = sum * 10 + digit[i];
return sum;
}

int main()
{
unsigned int num[N];
unsigned int temp[N];
int flag[N];
int n;

while (scanf("%d", &n) != EOF && n != 0)
{
int i, j, count;
for (i = 0; i < n; i++)
scanf("%d", &num[i]);    //依次接收数(我感觉这个效率不高,我觉得先全部接收,一次就可以排完,不用每次排一遍)
Sort(num, n);
for (i = 0; i < n; i++)
{
flag[i] = 0;
temp[i] = max(num[i]);  //调用重排数的函数
}
for (i = 0; i < n; i++)
if (flag[i] == 0)
{
for (j = i + 1; j < n; j++)
if (flag[j] == 0 && temp[i] == temp[j])
{
flag[i] = 1;
flag[j] = 1;
}
}
for (i = 0, count = 0; i < n; i++)
{
if (flag[i] == 0)
{
if (count == 0)
printf("%d",num[i]);
else
printf(" %d",num[i]);
count++;
}
}
if (count == 0)
printf("None");
printf("\n");
}

return 0;
}

看看大家还有什么不懂得,请在下方评论区留言

 

0.0分

0 人评分

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

  评论区