C语言练习2.1 之 数组2

C语言练习2.1 之 数组2

排序2

标题:
排序2

类别:
数组

时间限制
2S

内存限制
1000Kb

问题描述:
给定N个不同的整数,要求对这N个整数按如下规则排序并输出。
规则一:所有的偶数排在奇数前面。
规则二:在规则一的前提下按照从大到小的顺序排序。

输入说明
数据由两行构成,第一行为整数n(n<=100),表示待排序整数的数量。第二行是n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。

输出说明
在一行输出排好序的整数,整数之间以空格间隔。

输入样例
5
1 2 3 4 5

输出样例
4 2 5 3 1

#include<stdio.h>
void sort(int A[100],int x);
int main()
{
	int n,j=0,m=0,a[100],b[100],c[100];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(int i=0;i<n;i++)
	if(a[i]%2==0)
	b[m++]=a[i];
	else
	c[j++]=a[i];
	sort(b,m);
	sort(c,j);
	
	return 0;
}

void sort(int A[100],int x)
{
	int i,j,t;
	for(i=0;i<x-1;i++)
	for(j=i;j<x;j++)
		if(A[i]<A[j])
		{
			t=A[i];
			A[i]=A[j];
			A[j]=t;
		}
	for(i=0;i<x;i++)
	printf("%d ",A[i]);
}

马鞍点

标题
马鞍点

类别
数组

时间限制
2S

内存限制
1000Kb

问题描述
若一个矩阵中的某元素在其所在行最小而在其所在列最大,则该元素为矩阵的一个马鞍点。
请写一个程序,找出给定矩阵的马鞍点。

输入说明
输入数据第一行只有两个整数m和n(0<m<100,0<n<100),分别表示矩阵的行数和列数;
接下来的m行、每行n个整数表示矩阵元素(矩阵中的元素互不相同),整数之间以空格间隔。

输出说明
在一行上输出马鞍点的行号、列号(行号和列号从0开始计数)及元素的值(用一个空格分隔),之后换行;
若不存在马鞍点,则输出一个字符串“no”后换行。

输入样例
4 3
11 13 121
407 72 88
23 58 1
134 30 62

输出样例
1 1 72

#include<stdio.h>
int main()
{
	int m,n,b=0,c=0,e=0,j,i;
	int a[100][100];
	scanf("%d%d",&m,&n);//m=4,n=3
	for(i=0;i<m;i++)
	for(j=0;j<n;j++)
	scanf("%d",&a[i][j]);
	
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
		if(a[i][b]>a[i][j])
		b=j;
		}//行最小 
		for(j=0;j<m;j++)
		{
			if(a[i][b]>=a[j][b])
			c++;
		}
		if(c==m)//列最大 
		{
		printf("%d %d %d\n",i,b,a[i][b]);
		e++;
		}
		b=0;
		c=0;
	}
	if(e==0)
	printf("no\n");
 } 

查找

标题
查找

类别
数组

时间限制
1S

内存限制
256Kb

问题描述
给定一个包含n个整数的数列A0,A1,A2,…An-1和一个整数k,依次输出 k在序列中出现的位置(从0开始计算)。

输入说明
输入由两行构成,第一行为两个整数n和k,分别表示数列中整数个数和待查找整数k,n和k之间用空格分隔,0<n<100,0<k<10000。
第二行为n个整数,表示数列中的各个整数,整数之间用空格分隔,每个整数均不超过10000。

输出说明
依次输出整数k在数列中出现的位置(从0开始计算),如果k未在数列中出现,则输出-1。

输入样例
样例1输入
5 20
10 20 30 20 5

样例2输入
5 20
10 30 25 34 44

输出样例
样例1输出
1 3

样例2输出
-1

#include<stdio.h>
int main()
{
	int n,k,i,j,a[100],b[100]={101};
	j=0;
	scanf("%d%d",&n,&k);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(i=0;i<n;i++)
	if(a[i]==k)
		b[j++]=i;
	if(b[0]==101)
	printf("-1");
	else
	for(i=0;i<j;i++)
	printf("%d ",b[i]);
	
	return 0;
 } 

Z字形扫描

标题
Z字形扫描

类别
数组

时间限制
1S

内存限制
256Kb

问题描述
在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个m×n的矩阵,Z字形扫描的过程如下图所示。
在这里插入图片描述

对于下面给出的4×4的矩阵:
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
对其进行Z字形扫描后得到长度为16的序列如下所示:
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。

输入说明
数据的第一行为整数n(n<100),表示矩阵的行和列数;接下来的n行数据,每行分别为n个整数值(每个整数值都不超过1000),即矩阵的值

输出说明
在一行上输出Z字形扫描得到的整数序列,整数之间用空格分隔

输入样例
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
输出样例
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3

#include<stdio.h>
int main()
{
    int n,i,ii,temp,j;
    scanf("%d",&n);
    int a[n][n];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
        printf("%d ",a[0][0]);
    for(ii=1;ii<n*2;ii++)
    {
        if(ii<n)
        {
            if(ii%2==1)//奇数则是从小到大
            {
                for(i=0;i<ii+1;i++)
                    printf("%d ",a[i][ii-i]);
            }
            else//偶数则是从大到小
            {
                for(i=0;i<ii+1;i++)
                    printf("%d ",a[ii-i][i]);
            }
        }
        else
        {
            if(ii%2==1)//奇数则是从小到大,输出次数为2*n-ii次,横坐标是从ii-n+1开始
            {
                for(i=0;i<2*n-1-ii;i++)
                    printf("%d ",a[ii-n+1+i][n-1-i]);
            }
            else
            {
                for(i=0;i<2*n-1-ii;i++)
                    printf("%d ",a[n-1-i][ii-n+1+i]);
            }
        }
    }
}

中间数

标题
中间数

类别
时间限制
1S

内存限制
256Kb

问题描述
在一个整数序列A1, A2, …, An中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。
在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
给定一个整数序列,请找出这个整数序列的中间数的值。

输入说明
输入的第一行包含了一个整数n,表示整数序列中数的个数,1 ≤ n ≤ 1000。
第二行包含n个正整数,依次表示A1, A2, …,An,1 ≤ Ai ≤ 1000。

输出说明
如果序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。

输入样例
输入样例1
6
2 6 5 6 3 5
输入样例2
4
3 4 6 7

输出样例
输出样例1
5
输出样例2
-1

样例说明
样例1中比5小的数有2个,比5大的数也有2个。因此中间数是5
样例2中4个数都不满足中间数的定义,因此中间数是-1

#include <stdio.h>
int main()
{
	int n, i, j;
	scanf("%d", &n);
	
	int a[n];
	for(i=0; i<n; i++)
	scanf("%d", &a[i]);
	
	int high, low, out=-1; 
	for(i=0; i<n; i++)
	{
		high=0; low=0;
		for(j=0; j<n; j++)
		{
			if(a[j]<a[i])
			low++;
			else if(a[j]>a[i])
			high++;
		}
		if(high==low)
		{
			out=a[i];
			break;
		}
	}
	printf("%d", out);
	return 0;
} 

杨辉三角

给出正整数n(2<=n<=10),输出杨辉三角前n行
杨辉三角性质:三角形中的每个数字等于它两肩上的数字相加

输入格式:输入一个正整数n
输出格式:输出杨辉三角的前n行,元素中间用一个空格分隔,每行用换行分隔

输入样例:
4

输出样例
1
1 1
1 2 1
1 3 3 1

#include<stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    int n = 0;
    int arr[100][100];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        for (j = 0; j <= i; j++)
        {
            arr[i][0] = 1;
            if (i == j)
            arr[i][j] = 1;
        }
    }

    for (i = 2; i < n; i++)
    {
        for (j = 1; j < i; j++)
        {
            arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
        }
    }

    for (i = 0; i < n; i++)
    {
        for (j = 0; j <= i; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
	return 0;
}

字符串压缩

标题
字符串压缩

类别
字符串处理

时间限制
1S

内存限制
1000Kb

问题描述
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,将采用该压缩方法得到的字符串解压缩,还原出原字符串并输出。

输入说明
输入数据为一个字符串(长度不大于50,只包含字母和数字),表示压缩后的字符串

输出说明
在一行上输出解压缩后的英文字符串(长度不超过100),最后换行。

输入样例
a5b3aba13b4

输出样例
aaaaabbbabaaaaaaaaaaaaabbbb

#include<stdio.h>
int main()
{
	int i=0,sum,count,k;
	char s[50];
	gets(s);
	while(s[i])
	{
		printf("%c",s[i]);
		i++;sum=0;count=0;
		while(s[i]>='0'&&s[i]<='9')
		{
			sum = sum*10+s[i]-'0';
			i++;count++;
		}
		for(k=0;k<sum-1;k++)
			printf("%c",s[i-count-1]);
	}
	return 0;
}

字符统计

标题
字符统计

类别
字符串处理

时间限制
1S

内存限制
256Kb

问题描述
给出一个字符C和一行文字S,统计在这行文字S中字符C出现的次数。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入说明
输入数据由两行构成。
第一行包含一个字符C和一个数字n。字符C为大小或小写英文字母。数字n表示大小写敏感选项,当数字n为0时表示大小写不敏感,当数字n为1时表示大小写敏感。字符C和数字n之间用空格分隔。
第二行为一个字符串S,字符串由大小写英文字母组成,不含空格和其他字符。字符串S长度不超过100。

输出说明
输出字符C在字符串S中出现的次数。

输入样例
样例1输入
L 1
HELLOWorld
样例2输入
L 0
HELLOWorld

输出样例
样例1输出
2
样例2输出
3

#include<stdio.h>
int main()
{
	char a,c[100];
	int b,d,n=0,i;
	scanf("%c%d\n",&a,&b);
    gets(c);
	if(b==1)
	{
		for(d=0;c[d]!='\0';d++)
		{
			if(a==c[d])
			n=n+1;
		}
		printf("%d",n);
	}
	if(b==0)
	{ 
	if(a>=97)
	a=a-32;
		for(d=0;c[d]!='\0';d++)
		{
			if(c[d]>=97&&c[d]<=122)
			c[d]=c[d]-32;
		}
		for(d=0;c[d]!='\0';d++)
		{
			if(a==c[d])
			n=n+1;
		}
	  printf("%d",n);
	}
	return 0;
}

欢迎打赏加三连

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页