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

目录

 

数组和字符串

逆序输出

数组的输入与输出

开灯问题

蛇形填数

斜线填数

一字填数

竖式问题

输入一些数,统计个数

将数值存储到动态数组中

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


数组和字符串

逆序输出

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

猜你喜欢

转载自blog.csdn.net/qq_36171287/article/details/84556742