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;
}

 

目录
相关文章
|
1月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
49 1
|
1月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
C语言
C语言------程设设计入门
这篇文章是C语言程序设计的入门教程,涵盖了C程序的实现过程、VC集成开发环境的使用、基本数据类型的使用、格式控制字符的作用,以及通过示例代码演示了如何使用printf()函数输出不同类型的数据。
C语言------程设设计入门
|
1月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
17 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
1月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
37 0
|
1月前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
1月前
|
算法 关系型数据库 MySQL
揭秘MySQL中的版本号排序:这个超级算法将颠覆你的排序世界!
【8月更文挑战第8天】在软件开发与数据管理中,正确排序版本号对软件更新及数据分析至关重要。因MySQL默认按字符串排序版本号,可能出现&#39;1.20.0&#39;在&#39;1.10.0&#39;之前的不合理情况。解决办法是将版本号各部分转换为整数后排序。例如,使用`SUBSTRING_INDEX`和`CAST`函数从`software`表的`version`字段提取并转换版本号,再按这些整数排序。这种方法可确保版本号按逻辑正确排序,适用于&#39;major.minor.patch&#39;格式的版本号。对于更复杂格式,需调整处理逻辑。掌握此技巧可有效应对版本号排序需求。
86 3
|
1月前
|
NoSQL Java 编译器
C语言从入门到精通该怎样学?
持续学习与实践:编程是一门需要不断学习和实践的技能,要保持对新技术和新知识的敏感性,并持续进行编程实践。
34 1
|
29天前
|
机器学习/深度学习 存储 并行计算
C语言与机器学习:K-近邻算法实现
C语言与机器学习:K-近邻算法实现
35 0
|
2月前
|
存储 Java C语言
【C语言入门】初识C语言:掌握编程的基石
【C语言入门】初识C语言:掌握编程的基石
49 4
【C语言入门】初识C语言:掌握编程的基石