C语言题目13
//有两列数字, A{1,2,3,4,5,6,7,8,9} B{10,11,12,13,14,15}
//合并成一个新的数列C,要求所有的奇数排在所有的偶数前面,
//并且奇数要升序,偶数要降序,输出数列C到屏幕上
#include"stdio.h"
int getminodd(int c[], int start, int n)
{
int k;
int minodd = start;
while(c[minodd]%2 == 0)
{
minodd = minodd+1;
if(minodd == n)
{
break;
}
}
if(minodd != n)
{
for(k=minodd; k<n; k++)
{
if((c[minodd]>c[k]) && c[k]%2 == 1)
{
minodd = k;
}
}
}
return minodd;
}
int getmaxeven(int c[], int start, int n)
{
int k;
int maxeven = start;
while(c[maxeven]%2 != 0)
{
maxeven = maxeven+1;
if(maxeven == n)
{
break;
}
}
if(maxeven != n)
{
for(k=maxeven; k<n; k++)
{
if((c[maxeven]<c[k]) && c[k]%2 == 0)
{
maxeven = k;
}
}
}
return maxeven;
}
int main()
{
int a[9] = {1,2,3,4,5,6,7,8,9};
int b[6] = {10,11,12,13,14,15};
int c[15] = {};
int i;
int j;
int k=0;
int count=0;
int minodd=0;
int maxeven=0;
int swap;
//合并
for(i=0; i<9; i++)
{
c[k] = a[i];
k = k+1;
}
for(j=0; j<6; j++)
{
c[k] = b[j];
k = k+1;
}
//奇数部分选择排序
while(1)
{
minodd = getminodd(c, count, 15);
if(minodd == 15)
{
break;
}
swap = c[count];
c[count] = c[minodd];
c[minodd] = swap;
count = count+1;
if(count >= 15)
{
break;
}
}
//偶数部分选择排序
while(1)
{
maxeven = getmaxeven(c, count, 15);
if(maxeven == 15)
{
break;
}
swap = c[count];
c[count] = c[maxeven];
c[maxeven] = swap;
count = count+1;
if(count >= 15)
{
break;
}
}
//输出
for(k=0; k<15; k++)
{
printf("%d ", c[k]);
}
printf("\n");
return 1;
}
C语言题目8
//有两个集合A={a,b,f,d,e} B={g,b,h,d,e,e} 合并为一个集合C, C中的元素是递增排列的,并且无重复元素。
//这道题也可以拼接两个集合到一个集合,然后排序消重。
#include"stdio.h"
int getmin(char k[], int n)
{
int min = -1;
int i;
for(i=0; i<n; i++)
{
if(k[i] != '#')
{
min = i;
}
}
if(min != -1)
{
for(i=0; i<5; i++)
{
if((k[i] == '#') || i == min)
{
continue;
}
if(k[i] < k[min])
{
min = i;
}
else if(k[i] == k[min])
{
k[i] = '#';
}
}
}
return min;
}
int main()
{
char a[5] = {'a','b','f','d','e'};
char b[6] = {'g','b','h','d','e','e'};
char c[12] = {};
int i = 0;
int j = 0;
int mina;
int minb;
int k = 0;
int flaga = 0;
int flagb = 0;
while(1)
{
mina = getmin(a,5);
minb = getmin(b,6);
if((mina != -1) && (minb != -1))
{
if(a[mina] < b[minb])
{
c[k] = a[mina];
a[mina] = '#';
k = k+1;
}
else if(a[mina] == b[minb])
{
c[k] = a[mina];
a[mina] = '#';
b[minb] = '#';
k = k+1;
}
else
{
c[k] = b[minb];
b[minb] = '#';
k = k+1;
}
}
else if((mina == -1) && (minb != -1))
{
c[k] = b[minb];
b[minb] = '#';
k = k+1;
}
else if((mina != -1) && (minb == -1))
{
c[k] = a[mina];
a[mina] = '#';
k = k+1;
}
else
{
c[k] = '#';
break;
}
}
i = 0;
while(i<12)
{
if(c[i] == '#')
{
printf("\n");
break;
}
else
{
printf("%c ", c[i]);
i = i+1;
}
}
}
C语言题目3
//用C编写程序:输入一系列整数,保存这些整数,将所有奇数放在所有偶数之前,并且奇数部分和偶数部分需要按从小到大顺序排列,最后输出。
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
int x;
struct node *next;
}llnode;
llnode* getNumberList()//此函数建立临时链表,用来接收用户输入
{
int number = 0;
llnode *head = (llnode *)malloc(sizeof(llnode));
llnode *p = head;
p->x = 0;
p->next = NULL;
printf("请输入一列整数,数字之间用空格隔开,以输入#并回车结束:");
while(scanf("%d", &number))
{
llnode *n = (llnode *)malloc(sizeof(llnode));
n->x = number;
n->next = NULL;
p->next = n;
p = n;
head->x ++;
}
return head;
}
int* getNumberArray(llnode *head)//此函数用来处理用户输入,把用户输入从链表转移到动态数组,以便后面的操作
{
llnode *p = head;
llnode *q = head;
int *numberarray;
int i;
numberarray = (int *)malloc(sizeof(int)*(head->x));
p = head->next;
while(p!=NULL)
{
numberarray[i] = p->x;
i++;
p = p->next;
}
return numberarray;
}
void removeNumberList(llnode *head)//此函数用于删除临时链表,释放空间
{
llnode *p = head;
llnode *q = head;
while(p!=NULL)
{
q = p->next;
free(p);
p = q;
}
}
void divideNumberArray(int *numberarray, int n)//此函数用于把奇数放到偶数的前面
{
int start = 0;
int end = n-1;
int swap = 0;
for(start=0; start<end; start++)
{
if(numberarray[start]%2 == 0)
{
for(; end>start; end--)
{
if(numberarray[end]%2 == 1)
{
swap = numberarray[start];
numberarray[start] = numberarray[end];
numberarray[end] = swap;
break;
}
}
}
}
}
int getCut(int* numberarray, int n)//此函数用于得到奇数和偶数的划分点
{
int i = 0;
for(i=0; i<n; i++)
{
if(numberarray[i]%2 == 0)
{
return i;
}
}
}
void sortNumberArray(int* numberarray, int start, int end)//此函数用于对指定范围内的数据进行升序排序
{
int i = 0;
int j = 0;
int min = 0;
int swap = 0;
for(i=start; i<=end; i++)
{
min = i;
for(j=i+1; j<=end; j++)
{
if(numberarray[j] < numberarray[min])
{
min = j;
}
}
swap = numberarray[min];
numberarray[min] = numberarray[i];
numberarray[i] = swap;
}
}
int main()
{
int i = 0;
int nodecount = 0;
int *numberarray;
int cut = 0;
llnode *head;
head = getNumberList();//由于不确定用户输入数据的多少,所以要采用链表,这样就解决了不知道用户会输入多少个数字的情况
nodecount = head->x; //记录一下用户输入了多少数据
numberarray = getNumberArray(head);//把临时链表的数据放到动态数组以便后续的处理
removeNumberList(head);//至此numberarray存储了用户输入的所有数据,我们可以把之前的链表删除了,要不然会浪费内存资源
//至此我们可以专心处理数组numberarry了,nodecount是数组元素个数
divideNumberArray(numberarray, nodecount);//把奇数放到偶数的前面
cut = getCut(numberarray, nodecount);//得到奇数和偶数的划分点
sortNumberArray(numberarray, 0, cut-1);//对奇数排序
sortNumberArray(numberarray, cut, nodecount-1);//对偶数排序
for(i=0; i<nodecount; i++)//输出结果
{
printf("%d ", numberarray[i]);
}
printf("\n");
return 0;
}