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;
}
歡迎打賞加三連