题目及要求如下图所示:
代码如下:
#include<stdio.h>
void bubble_sort(int arr[],int n){//冒泡排序发法
int i,j,temp;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(arr[i]>arr[j]){
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
void show(int arr[],int n){//输出函数,不输出数组中值为0的 项
int i;
printf("%d",arr[0]);//输出第一个数
for(i=1;i<n;i++){
if(arr[i]!=0){//从第二个数开始,先输出一个空格,再输出值,满足题目要求
printf(" %d",arr[i]);
}
}
}
int main(){
int i,n;
scanf("%d",&n);//输入正整数n
int nums[n];//数组nums存放接收到的n个正整数
int sign[10000];//数组sign用来记录被标记的数
for(i=0;i<n;i++){
scanf("%d",&nums[i]);
int num=nums[i];
while(num>1){
if(num%2==0){
num=num/2;
}
else{
num=(num*3+1)/2;
}
sign[num]=1;
}
}
for(i=0;i<n;i++){
if(sign[nums[i]]==1){
//如果输入nums[i]已经被sign数组标记,则把0赋给nums[i],且最终不输出nums[n]中值为0项
nums[i]=0;
/*eg:当输入的n为3时,while循环中计算了3,5,8,4,2,1,即 sign[5],sign[8],sign[4],sign[2]都被标记为1。当我们在输入 nums[i]的值为5,8,4,2时,这些值已经被sign数组标记,直接把0赋给他,且不输出。这样就只输出了关键数字*/
}
}
bubble_sort(nums,n);
show(nums,n);
return 0;
}
1. eg:当输入的n为3时,while循环中计算了3,5,8,4,2,1,sign[5],sign[8],sign[4],sign[2]都被标记为1。当我们在输入 nums[i]的值为5,8,4,2时,这些值已经被sign数组标记,直接把0赋给他,且不输出。这样就只输出了关键数字。
2. 数组sign用来记录被标记的数 ,数字定义大一点,定义小了,例如sign[100]题目不给过。
3.冒泡排序法可以用C语言函数库中qsort()方法。
#include <stdlib.h> //使用qsort()需要引入的头文件
void qsort(
void *buf,
size_t num,
size_t size,
int (*compare)(const void *, const void *) );
函数功能:对指向的数据进行排序,数组中有num个元素,每个元素的大小为size。
buf:指向数组的起始地址,通常传入数组名即可
num:数组的元素个数
size:数组中每个元素的大小(字节数)
(*compare)(const void *, const void *) 指向比较函数的函数指针,指定排序规则。
函数返回值:void
4.注意题目输出要求,第一个输出前和最后一个输出后没有空格。