算法竞赛入门经典(一)---数组和字符串

简介: 目录 数组和字符串逆序输出数组的输入与输出开灯问题蛇形填数斜线填数一字填数竖式问题输入一些数,统计个数将数值存储到动态数组中输入一些数,输出最大值,最小值数组和字符串...

目录

 

数组和字符串

逆序输出

数组的输入与输出

开灯问题

蛇形填数

斜线填数

一字填数

竖式问题

输入一些数,统计个数

将数值存储到动态数组中

输入一些数,输出最大值,最小值


数组和字符串

逆序输出

#include<stdio.h>
#define max 105
int a[max];
int main()
{
  int x, n = 0;
  while (scanf("%d",&x) == 1)
    a[n++] = x;
  for(int i = n-1; i>=1; i--)
    printf("%d ",a[i]);
  printf("%d\n",a[0]);
  return 0;
}

注意:如果要结束数组的输入并输出数组,需要按CTRL+D,然后回车就可以倒序输出数组数据。

 

数组的输入与输出

#include<stdio.h>
int a[5];
int main()
{
	for(int i=0;i<5;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int k=0;k<5;k++)
	{
		printf("%4d\t",a[k]);
	}
	return 0;
}

开灯问题

有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开,开着灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?
输入:n和k,输出开着的灯编号。k≤n≤1000。

#include "stdio.h"
#include "string.h"
int main()
{
	int i,j,n,k;
	int first=1;
	int a[1000];
	memset(a,0,sizeof(a));//把数组a清零,在string.h中定义
	scanf("%d%d",&n,&k);
	//k个人对n盏灯进行操作 
	for(i=1;i<=k;i++)
		for(j=1;j<=n;j++)
		  if(j%i==0) a[j]=!a[j];
	//输出最后剩下的灯的编号	  
	for(i=1;i<=n;i++)
		if(a[i]){
			if(first)first=0;//去除第一数之前的空格 
			else
				printf(" ");
			printf("%d",i);	
		}
	printf("\n");
	return 0;
}

 

蛇形填数

在写四句并列的while语句时,需要注意不要超出边界,不然将会在输入数字之后,一直在循环中运行。

#include "stdio.h"
#include "string.h"
	
int main()
{
	int a[10][10];
	int n,x,y,top=0;
	scanf("%d",&n);
	memset(a,0,sizeof(a));  //数组清零
	top=a[x=0][y=n-1] = 1;   //已经经过的格子置零
	while(top<n*n)
	{
		while(x+1<n && a[x+1][y]==0) a[++x][y] = ++top;  //越界只需判断x+1<n;下一个格子是(x+1,y),所以判断a[x+1][y]==0
		while(y-1>=0 && a[x][y-1]==0) a[x][--y] = ++top;
		while(x-1>=0 && a[x-1][y]==0) a[--x][y] = ++top;
		while(y+1<n && a[x][y+1]==0) a[x][++y] = ++top;
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
			printf("%3d",a[i][j]);
	printf("\n");
	}

	return 0;
}

斜线填数

#include<stdio.h>
int main()
{
    int n,num,matrix[30][30];
    int i,j;
    while(scanf("%d",&n)>0)
    {
        num=0;
        //遍历连接上三角的斜线,包括对角线
        for(i=0; i<n; ++i)
        {
            if(i%2==0)  //则最小值在下面
            {
                for(j=i; j>=0; --j) //上三角第i条斜线有i个点
                    matrix[j][i-j]=++num;   //有i个点所以行递减i次,每个点的行列相加等于i所以列=i-行
            }
            else    //否则最小值在上面
            {
 
                for(j=0; j<=i; ++j) //和最小值在下面类似
                    matrix[j][i-j]=++num;
            }
        }
 
        //遍历连接下三角的斜线,比上三角复杂
        for(i=n-2; i>=0; --i)   //为了通过每条斜线的点数i控制行列关系所以递减i
        {
            if(i%2==0)  //则最小值在下面
            {
                int tem=n;  //最小值在下面用tem控制行递减
                for(j=n-1-i; j<n; ++j)  //列等于总列数减去该斜线的总点数i,减一是为了对应0
                    matrix[--tem][j]=++num;
            }
            else    //否则最小值在上面
            {
                int tem=n;  //同上
                for(j=n-1-i; j<n; ++j)
                    matrix[j][--tem]=++num;
            }
        }
        //输出蛇形阵
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
                printf("%4d",matrix[i][j]);
            printf("\n");
        }
 
    }
    return 0;
}

一字填数

#include<stdio.h>
int main()
{
    int n,num,matrix[30][30];

    while(scanf("%d",&n))
    {
		int i;
        num=0;
        //构造一字阵
        for( i=0; i<n; ++i)  //行递增
            if(i%2==0)  //如果为偶行,则列递增
                for(int j=0; j<n; ++j)
                    matrix[i][j]=++num;
            else    //如果为奇行,则列递减
                for(int j=n-1; j>=0; --j)
                    matrix[i][j]=++num;
        //输出一字阵
        for(i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                printf("%4d",matrix[i][j]);
            printf("\n");
        }
 
    }
    return 0;
}

竖式问题

#include "stdio.h"
#include "string.h"
	
int main()
{
	int i,ok,abc,de,x,y,z,count=0;
	char s[20],buf[99];
	scanf("%s",s);
	for(abc=111;abc<=999;abc++)
		for(de=11;de<=99;de++)
		{
			x=abc*(de%10); y=abc*(de/10); z=abc*de;
			sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);  //输出到字符串
			ok=1;
			for(i=0;i<strlen(buf);i++)  //strlen获取字符串的实际长度
				if(strchr(s,buf[i])==NULL) ok=0;
			if(ok)
			{
				printf("<%d>\n",++count);
				printf("%5d\n*%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
			}
		}
	printf("The number of solutions = %d\n",count);
	return 0;
}

输入一些数,统计个数

注意:win的结束要先回车,再Ctrl+Z,再回车

#include<stdio.h>
int main()
{
	int n,count=0;
	while(~scanf("%d",&n))
	{
		count++;
	}
	printf("%d\n",count);
    return 0;
}

将数值存储到动态数组中

#include<stdio.h>
#include <stdlib.h>  //malloc的头文件
int main()
{
	int *a;
	int m,n=5;
	a=(int *)malloc(n*sizeof(int));   //定义一个动态数组
	for(int i=0;i<n;i++)   //循环输入数组数据
	{
		scanf("%d",&m);
		char c=getchar();//getchar函数,从键盘的缓冲区中得到一个字符常量并赋值给c
		a[i]=m;
		if(c=='\n')   //当键盘输入回车时结束输入输入
		{
            break;
        }
	}
    return 0;
}

输入一些数,输出最大值,最小值

#include<stdio.h>
#include <stdlib.h>  //malloc的头文件
int main()
{
	int *a;
	int m,n=1000,count=0;
	int max=0,min=1000;
	double ave;
	a=(int *)malloc(n*sizeof(int));   //定义一个动态数组
	for(int i=0;i<n;i++)   //循环输入数组数据
	{
		scanf("%d",&m);
		char c=getchar();//getchar函数,从键盘的缓冲区中得到一个字符常量并赋值给c
		a[i]=m;
		if(max<m) max=m;
		if(min>m) min=m;
		if(c=='\n')   //当键盘输入回车时结束输入输入
		{
            break;
        }					
		count++;
	}
	for(int j=0;j<count+1;j++)
	{
		printf("%d\t",a[j]);
	}
	printf("\n");
	printf("%d\t%d\n",max,min);
    return 0;
}

 

目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
40 0
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
33 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
90 1
两个字符串匹配出最长公共子序列算法
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
23 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
2月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
2月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
4月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。