明明生成了个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
数据范围: ,输入的数字大小满足
明明生成了个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。
输出多行,表示输入数据处理后的结果
3 2 2 1
1 2
输入解释: 第一个数字是3,也即这个小样例的N=3,说明用计算机生成了3个1到500之间的随机整数,接下来每行一个随机数字,共3行,也即这3个随机数字为: 2 2 1 所以样例的输出为: 1 2
#include "stdio.h" #include "string.h" //思路:四部分,输入,去重,排序,最后输出。——可以直接先排序,之后去重和输出合为一体(输出不重复部分) void upper_bubble_sort(int val[],int n) { int a = 0,b = 0,temp; for(;a < n; a++) { for(b = 0; b < n -a -1; b++) { if (val[b] > val[b+1]) { temp = val[b]; val[b] = val[b+1]; val[b+1] = temp; } } } } int main() { //输入部分。其中:n为数据个数,val数组存放输入的数字。 int n,val[1000],i,out[1000],c; scanf("%d",&n); for(i = 0; i < n; i++) { scanf("%d",&val[i]); } //也可以先排序再去重?先试试冒泡吧。 //排序部分 upper_bubble_sort(val, n); //去重和输出合为一体,即直接输出不重复部分。 printf("%d\n",val[0]); for (i = 0; i < n -1; i++) //这里不是n-1的话会溢出,吃过一次亏引以为戒 { if (val[i] < val[i + 1]) { printf("%d\n",val[i+1]); } } }
#include <stdio.h> int main() { int n; scanf("%d", &n); int a[500] = {0}; int num = 0; for (int i = 0; i < n; i++) { int x; scanf("%d", &x); a[x - 1] += 1; } for (int i = 0; i < 500; i++) { if (a[i] > 0) { printf("%d\n", (i + 1)); } } return 0; }
//这个也能算较难? #include <stdio.h> #include <time.h> #include <stdlib.h> int main() { //输入 int m =0; int arr[1000]={0}; int i =0; int haxh[501]={0}; scanf("%d",&m); //去重复 for(i = 0;i<m;i++) { scanf("%d",&arr[i]); if(haxh[arr[i]] ==0) haxh[arr[i]]=1; } //排序 for(i=0;i<501;i++) { if(haxh[i]) { printf("%d\n",i); } } return 0; }
BitMap去重
#include<stdbool.h> #include<stdlib.h> #include<stdio.h> #define MAX_NUM 500 unsigned char* creatBitMap(int n); bool isExist(unsigned char* base,unsigned int n); void input(unsigned char* base); unsigned int byteStep(unsigned int n); // 返回数字n相较base位置 unsigned char bitAddr(unsigned int n); // 返回数字n所在bit的地址(0 ~ 7) unsigned int getNum(unsigned int step, unsigned char bit); //返回 *(base + step)第bit所代表的数字 void printNum(unsigned char* base, int step); //打印对应byte的所有数字 void addNum(unsigned char* base, unsigned int n); int main() { int n = 0; scanf("%d", &n); unsigned char* base = creatBitMap(n); for (int i = 0; i < n; i++) { input(base); } for (int i = 0; i < MAX_NUM + 1; i++) { printNum(base, i); } free(base); return 0; } // 程序结束时手动销毁 unsigned char* creatBitMap(int n) { unsigned char* base = (unsigned char*)calloc(MAX_NUM + 1, sizeof(char)); return base; } // 输入至位图 void input(unsigned char* base) { int val = 0; scanf("%d", &val); addNum(base, val); } void addNum(unsigned char* base, unsigned int n) { int step = byteStep(n); char bit_addr = bitAddr(n); char binary = 1 << bit_addr; *(base + step) |= binary; } unsigned int byteStep(unsigned int n) { unsigned int step = n / 8; return step; } unsigned char bitAddr(unsigned int n) { unsigned bit = n % 8; return bit; } unsigned int getNum(unsigned int step, unsigned char bit) { return step * 8 + bit; } void printNum(unsigned char* base, int step) { for (int i = 0; i < 8; i++) { unsigned num = getNum(step, i); if (isExist(base, num)) { printf("%d\n", num); } } } bool isExist(unsigned char* base, unsigned num) { int step = byteStep(num); int bit = bitAddr(num); if (*(base + step) & 1 << bit) { return true; } else { return false; } }
#include <stdio.h>//桶排序,牛友可以去B站搜讲解这个的,很简单就能做出来,无需开辟动态空间 //桶排序 int main() { int arr[1005]={0},n,t,i,num=0; scanf("%d",&n); for(i=1;i<=n;i++)//往桶里面存数,用1去标志有数的桶,输入N个数 { scanf("%d",&t); arr[t]=1; } for(i=1;i<=1000;i++) { if(arr[i]==1) { printf("%d\n",i); } } return 0; }
/** 题目:HJ3 明明的随机数 * 思路:声明数组array[501]并初始化为 0,用 temp 记录输入数字,将 array[temp] 置为 1,按序输出值为 1 的数组下标 * 难点:利用下标记录数值,利用数组存储的数值表示下标是否出现 */ #include <stdio.h> int main() { int array[501] = {0}; int num; int temp; int i = 0; scanf("%d", &num); // 依次输入的数字用temp存储,并将array[temp] 置为1 for(; i < num; i++) { scanf("%d", &temp); array[temp] = 1; } // 遍历数组array,输出值为 1 的下标 for(int j = 1; j < 501; j++) { if(array[j] == 1) { printf("%d\n", j); } } return 0; }
#include <stdio.h> #include <stdlib.h> #define MAX_VAL 500 int main() { int a[MAX_VAL], b; int i,n; memset(a, 0 , sizeof(int)*MAX_VAL); if (scanf("%d", &n) != EOF) { if (n >=1 && n<= 1000) { while (n) { n--; if (scanf("%d", &b) != EOF) { if (b >=1 && b<= MAX_VAL) { a[b-1] = 1; } else { printf("b over\n"); } } else { printf("none\n"); } } } else { printf("n over\n"); } } for (i = 0; i < MAX_VAL; i++) { if (a[i]) { printf("%d\n", i + 1 ); } } return 0; }
#include"stdio.h" #include"stdlib.h" void bubble_sort(int *p,int n) { int i = 0 , j =0; for(i=0;i<n-1;i++) { j=0; for(j=0;j<n-i-i;j++) { if(p[j]>p[j+1]) { int tmp = p[j]; p[j]=p[j+1]; p[j+1]=tmp; } } } } void ShowArr(int * p,int n) { int i = 0; for(i=0;i<n;i++) { printf("%d\n",p[i]); } } void ShortenArr(int * p,int n) { int i = 0; int j = 0; for(i=0;i<n;i++) { if(p[i] == 0) { for(j=i;j<n-i;j++) { p[j]=p[j+1]; } } } } int FindRenumber(int * p,int n) { int i = 0; int count; for(i=0;i<n-1;i++) // 注意这里容易出现野指针 { if(p[i] == p[i+1]) { count++; p[i]=0; } } return count; } //主程序开始 int main () { int n ; // 所输入的数据个数 scanf("%d",&n); int *arr; arr = (int *) malloc (n*sizeof(int)); if(arr == NULL) { exit(-1); } int i = 0; // 输入数据 for(i=0;i<n;i++) { scanf("%d",&arr[i]); } bubble_sort(arr,n); //排序 int lastlen = FindRenumber(arr,n); // 查找重复的数字并删除 ShortenArr(arr,n); ShowArr(arr,n-lastlen); // 打印数组 return 0; }
#include<stdio.h> #include<string.h> int main() { int arr[1000]={0}; int i,j,temp,num; while(scanf("%d",&num)!=EOF) { for(i=0;i<num;i++) { scanf("%d",&arr[i]); } for(i=0;i<num;i++) { temp=arr[i]; for(j=i+1;j<num;j++) { if(temp>arr[j]) { arr[i]=arr[j]; arr[j]=temp; } } } printf("%d\n",arr[0]); if (num>=1) { for(i=1;i<num;i++) { if(arr[i]>arr[i-1]) printf("%d\n",arr[i]); } } } return 0; }