解题思路:
肯定是先排序再去重了!!!先使用快速排序法或者冒泡排序法进行排序,排序没有什么难度,如果不懂排序的可以看看我之前写的排序法(带模板的啊)。
去重(C++):C++的去重和C有点不一样,因为C++有个函数可以去重(把重复的元素放到末尾),unique(a,b),参数是为去重前的首地址和尾地址,返回值为去重后的尾地址。利用这个函数可以快速方便的解决问题。
去重(C):C语言版本的就比较麻烦了,利用多个for循环,来解决。排序后的数组,使用一个for循环来统计不重复的数个数,再使用一个for循环来输出不重复的数字,没有C++的方便
题解不易,帮忙点个评分,支持一下。也希望各位大佬指点!!!
注意事项:
不要忘记数组的知识点,数组名可以表示首元素地址,数组名+数字 表示第n个数字的地址,数组元素地址 减(-) 数组元素地址,为这两个元素之间的元素总数(包括它们本身)。
参考代码:
C++代码
#include <iostream> #include <algorithm> using namespace std; const int N = 100; int nums[N]; void quick_sort(int nums[],int l,int r) { if(l >= r) return; int i = l - 1,j = r + 1,x = nums[(l + r) / 2]; while(i < j) { do i++;while(nums[i] < x); do j--;while(nums[j] > x); if(i < j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; } } quick_sort(nums,l,j); quick_sort(nums,j + 1,r); } int main() { int n; cin >> n; for(int i = 0;i < n;i++) cin >> nums[i]; quick_sort(nums,0,n - 1);//快排 n = unique(nums,nums + n) - nums;//去重函数,只是把重复的元素放后面,本来返回值是末尾元素的地址,然后减去首元素地址为数组长度 cout << n << endl; for(int i = 0;i < n;i++) cout << nums[i] << ' '; return 0; }
C语言代码
#include <stdio.h> void bubble_sort(int nums[],int len) { int i,j,temp; for(i = 0;i < len - 1;i++)//不循环到最后一个数字,是因为倒数第二个元素就能与它进行互换(不互换)操作 { for(j = 0;j < len - 1 - i;j++)//这里写成len - 1 - i,是因为经过前面的循环,后面的i个元素已经排序完成了 { if(nums[j] > nums[j + 1])//前面的数字比后面的数大时,就进行互换 { temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } } /* void quick_sort(int nums[],int l,int r)//快速排序法 { if(l >= r) return; int i = l - 1,j = r + 1,x= nums[(l + r) / 2]; while(i < j) { do i++;while(nums[i] < x); do j--;while(nums[j] > x); if(i < j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; } } quick_sort(nums,l,j); quick_sort(nums,j + 1,r); } */ int main() { int N; scanf("%d",&N); int i,nums[N]; for(i = 0;i < N;i++) { scanf("%d",&nums[i]);//把N个数字存入数组 } bubble_sort(nums,N);//再来一个快速排序法 quick_sort(nums,0,n - 1); int new_len = N;//用来计算不重复数字 for(i = 0;i < N;i++ ) { if(nums[i] == nums[i + 1]) new_len -= 1;//如果有相同数字,就减1 } printf("%d\n",new_len); for(i = 0;i < N;i++ ) { if(nums[i] != nums[i + 1])//如果前面的元素与后面的元素不相同就打印 printf("%d ",nums[i]); } return 0; }
0.0分
0 人评分
A+B for Input-Output Practice (V) (C++代码)浏览:485 |
A+B for Input-Output Practice (V) (C语言代码)浏览:640 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:624 |
1908题解浏览:680 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:569 |
2^k进制数 (C语言描述,蓝桥杯)浏览:1457 |
剪刀石头布 (C语言代码)浏览:1519 |
1052题解(链表操作)浏览:782 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:820 |
C语言程序设计教程(第三版)课后习题8.2 (C语言代码)浏览:1108 |