原题链接:剔除相关数
解题思路:
如何判断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分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复