解题思路:
如何判断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语言代码)浏览:713 |
字符串对比 (C语言代码)浏览:1351 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:512 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:658 |
用筛法求之N内的素数。 (C语言代码)浏览:650 |
Quadratic Equation (C语言代码)浏览:971 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:938 |
上车人数 (C语言代码)浏览:695 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:553 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:792 |