解题思路:
如何判断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语言程序设计教程(第三版)课后习题6.9 (C++代码)浏览:763 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:742 |
人见人爱A+B (C语言代码)浏览:1037 |
IP判断 (C++代码)浏览:721 |
逆反的01串 (C++代码)(依旧推荐switch)浏览:996 |
C二级辅导-计负均正 (C语言代码)浏览:601 |
C语言训练-排序问题<1> (C语言代码)浏览:1403 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1067 |
C语言训练-角谷猜想 (C语言代码)浏览:1761 |
A+B for Input-Output Practice (C++代码)浏览:628 |