1. 程式人生 > 其它 >C語言練習2.1 之 陣列2

C語言練習2.1 之 陣列2

技術標籤:XD# C語言學習作業c語言

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

歡迎打賞加三連