C语言算法竞赛入门(二)---数组元素移动 、排序问题 、猴子选大王问题

简介: 数组元素移动【问题描述】调整输入数组A[0..n],将其分为两部分,左边所有元素为奇数,右边所有元素为偶数【输入形式】a0,b1,b2,a1,a2,b3,a3,a4【输出形式】a0,a1,a2,a3,a4,b1,b...

数组元素移动

【问题描述】调整输入数组A[0..n],将其分为两部分,左边所有元素为奇数,右边所有元素为偶数
【输入形式】a0,b1,b2,a1,a2,b3,a3,a4
【输出形式】a0,a1,a2,a3,a4,b1,b2,b3
【样例输入】1,2,33,8,5
【样例输出】1,33,5,2,8

代码:

#include<stdio.h>

int main()
{
	int a[100];
	int n=100,i,j,count=1,m;
	for(i=0;i<n;i++)   //循环输入数组数据
	{
		scanf("%d",&a[i]);
		char c=getchar();//getchar函数,从键盘的缓冲区中得到一个字符常量并赋值给c
		if(c=='\n')   //当键盘输入回车时结束输入输入
		{
            break;
		}
		count++;
	}
	scanf("%d",&m);
	for(i=0;i<=count;i++)
	{	
		for(j=i+1;j<=count;j++)
		{
			if(m==(a[i]+a[j]))
			{
				printf("%d %d",a[i],a[j]);
				i=count+1; break;
			}
		}		
	}
	printf("\n");
	return 0;
}

 

排序问题

【问题描述】

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
【输入形式】

一个升序排序的数组以空格隔开,以及一个目标数字,换行输入
【输出形式】

如果存在数组中两个数字和为目标数字,则输出数字对;

如果存在多个满足条件的数字对,输入一对即可;

不存在则不输出;
【样例输入】

1 2 4 7 11 15

15

【样例输出】

4 11
【样例说明】

4+11=15
【评分标准】

时间复杂度必须为 O(n),否则酌情给分。

#include<stdio.h>
int main()
{
    int a[100],b[100],c[100];
    int i,count=0,j=0,k=0;
	char s;
	for(i=0;i<100;i++)
	{
		scanf("%d",&a[i]);
		char c=getchar();
		if(c=='\n')
		break;
		scanf("%c",&s);
		count++;
	}
	for(i=0;i<=count;i++)
	{
		if(a[i]%2==1||a[i]%2==-1)
		{
			b[j]=a[i];
			j++;
		}
		if(a[i]%2==0)
		{
			c[k]=a[i];
			k++;
		}		
	}
	printf("%d",b[0]);
	for(i=0;i<j;i++)
		printf(",%d",b[i]);
	for(i=0;i<k;i++)
		printf(",%d",c[i]);
	printf("\n");
    return 0;
}

猴子选大王问题

【问题描述】

N只猴子选大王,选举方法如下:所有猴子按1,2,3,&hellip; ,N编号围坐一圈,从第1个猴子开始报数,报到M号退出圈外,如此循环报数,直到圈内只剩下一个猴子,即为大王。编程输出大王的原始序号。N和M的值由键盘输入。如果你想成为剩下的那一个,在N一定的情况下,你应该站在什么位置上?编程实现位置的求解。
【输入形式】

输入两个数字N和M,N为猴子的个数,M为报到后退出圈外的数字。
【输出形式】

显示最后剩下的猴子的原始序号。

【样例输入】

5 3
【样例输出】

4
【样例说明】

共5个猴子围成一圈,报到3号退出圈外,最后留下的猴子的原始编号为4
【评分标准】

当输入的M,N不合法时应当给出错误提示&ldquo;请输入合法的M,N值!&rdquo;。

#include<stdio.h>

int main()
{
	int n,m;
	int last = 0;
	scanf("%d %d",&m,&n);
	
    if(n<1 || m<1 ) 
	{
		printf("请输入合法的M,N值!\n");
	}else{		
		for (int i=2;i<=m;i++)
		{
			last = (last+n)%i;
		}
		printf("%d\n",last+1);
	}
    return 0;
}

 

目录
相关文章
|
18天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
44 4
|
2月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
60 2
|
29天前
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
C语言算法复杂度
|
20天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
64 8
|
20天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
58 7
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
33 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
算法 C语言
【C语言】排序查找
【C语言】排序查找
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
23 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
30 1
|
2月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法