C語言練習題(一)
求n個整數中倒數第二小的數。每一個整數都獨立看成一個數,比如,有三個數分別是1,1,3,那麼,第二小的數就是1。
- 輸入
輸入包含多組測試資料。
輸入的第一行是一個整數C,表示有C測試資料;
每組測試資料的第一行是一個整數n,表示本組測試資料有n個整數(2<=n<=10),接著一行是 n個整數 (每個數均小於100);
- 輸出
請為每組測試資料輸出第二小的整數,每組輸出佔一行。
#include <stdio.h>int main(){ int T; int n; int i; int min; int min_flag; int number[11];
scanf("%d",&T);
while(T--){ scanf("%d",&n);
for(i=0;i<n;i++){ scanf("%d",&number[i]);
if(i==0){
min=number[0];
min_flag=0;
}
if(number[i]<min){
min=number[i];
min_flag=i;
}
}
for(i=0;i<n;i++){ if(i!=min_flag){
min=number[i]; break;
}
}
for(i=0;i<n;i++){ if(i!=min_flag && number[i]<min)
min=number[i];
}
printf("%d\n",min);
}
return 0;
}
奇偶數分離
有一個整型偶數n(2<= n <=10000),你要做的是:先把1到n中的所有奇數從小到大輸出,再把所有的偶數從小到大輸出。
- 輸入
第一行有一個整數i(2<=i<30)表示有 i 組測試資料;每組有一個整型偶數n。 - 輸出
第一行輸出所有的奇數。第二行輸出所有的偶數
#include <stdio.h>int main(){ int T; int i; int n;
scanf("%d",&T);
while(T--){
scanf("%d",&n); for(i=1;i<=n;i++){ if(i%2==1){ if(i==1) printf("%d",i);
else
printf(" %d",i);
}
}
printf("\n");
for(i=1;i<=n;i++){ if(i%2==0){ if(i==2) printf("%d",i);
else
printf(" %d",i);
}
}
printf("\n");
if(T!=0) printf("\n");
} return 0;
}
奇偶位互換
給定一個長度為偶數位的0,1字串,請程式設計實現串的奇偶位互換。
- 輸入
輸入包含多組測試資料;
輸入的第一行是一個整數C,表示有C測試資料;
接下來是C組測試資料,每組資料輸入均為0,1字串,保證串長為偶數位(串長<=50)。
- 輸出
請為每組測試資料輸出奇偶位互換後的結果;每組輸出佔一行。
#include <stdio.h>#include <string.h>int main(){ int T; char s[51]; int length; char temp; int i;
scanf("%d",&T);
while(T--){ scanf("%s",s);
length=strlen(s);
for(i=0;i<length-1;i+=2){
temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
printf("%s\n",s);
}
return 0;
}
統計硬幣
假設一堆由1分、2分、5分組成的n個硬幣總面值為m分,求一共有多少種可能的組合方式(某種面值的硬幣可以數量可以為0)。
- 輸入
輸入資料第一行有一個正整數T,表示有T組測試資料;接下來的T行,每行有兩個數n,m,n和m的含義同上。 - 輸出
對於每組測試資料,請輸出可能的組合方式數;每組輸出佔一行。
#include <stdio.h>int main(){ int T; int amount; int sum; int one_amount; int two_amount; int five_amount; int a; int b; int c; int result;
scanf("%d",&T);
while(T--){
result=0; scanf("%d%d",&amount,&sum);
one_amount=sum/1;
two_amount=sum/2;
five_amount=sum/5;
for(a=0;a<=one_amount;a++){ for(b=0;b<=two_amount;b++){ for(c=0;c<=five_amount;c++){ if((a+b+c)==amount && (a*1+b*2+c*5)==sum)
result++;
}
}
} printf("%d\n",result);
}
return 0;
}
漢字統計
統計給定文字檔案中漢字的個數。
- 輸入
輸入檔案首先包含一個整數n,表示測試例項的個數,然後是n段文字。 - 輸出
對於每一段文字,輸出其中的漢字的個數,每個測試例項的輸出佔一行。
#include <stdio.h>int main(){ int T; char c; int amount;
scanf("%d",&T);
getchar();
while(T--){
amount=0; while((c=getchar())!='\n'){ if(c<0 || c>127)
amount++;
} printf("%d\n",amount/2);
}
return 0;
}
偶數求和
有一個長度為n(n<=100)的數列,該數列定義為從2開始的遞增有序偶數,現在要求你按照順序每m個數求出一個平均值,如果最後不足m個,則以實際數量求平均值。程式設計輸出該平均值序列。
- 輸入
輸入資料有多組,每組佔一行,包含兩個正整數n和m,n和m的含義如上所述。 - 輸出
對於每組輸入資料,輸出一個平均值序列,每組輸出佔一行。
#include <stdio.h>int main(){ int sequence[101]; int i; int j; int n; int m; int result; int remainder; int flag;
for(i=0;i<101;i++)
sequence[i]=(i+1)*2;
while((scanf("%d%d",&n,&m))!=EOF){
result=0;
j=1;
flag=0;
remainder=n%m;
for(i=0;i<=n;i++){ if(j<=m){
result+=sequence[i];
}
else{ if(flag==0) printf("%d",result/m);
else
printf(" %d",result/m);
flag=1;
j=1;
result=sequence[i];
}
j++;
}
if(remainder){ printf(" %d",(result-sequence[n])/remainder);
}
printf("\n");
}
return 0;
}
楊輝三角
還記得中學時候學過的楊輝三角嗎?具體的定義這裡不再描述,你可以參考以下的圖形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
- 輸入
輸入資料包含多個測試例項,每個測試例項的輸入只包含一個正整數n(1<=n<=30),表示將要輸出的楊輝三角的層數。 - 輸出
對應於每一個輸入,請輸出相應層數的楊輝三角,每一層的整數之間用一個空格隔開,每一個楊輝三角後面加一個空行。
#include <stdio.h>
int main(){ int n; int triangle[31][31]; int i; int j;
while((scanf("%d",&n))!=EOF){ for(i=0;i<31;i++)
for(j=0;j<31;j++)
triangle[i][j]=0;
triangle[0][0]=1;
triangle[1][0]=1;
triangle[1][1]=1;
for(i=2;i<n;i++){
triangle[i][0]=1;
triangle[i][i]=1; for(j=1;j<=i;j++){
triangle[i][j]=triangle[i-1][j]+triangle[i-1][j-1];
}
}
for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(triangle[i][j]!=0){ if(j==0) printf("%d",triangle[i][j]);
else
printf(" %d",triangle[i][j]);
}
}
printf("\n");
}
printf("\n");
}
return 0;
}
統計字元
統計一個給定字串中指定的字元出現的次數
- 輸入
測試輸入包含若干測試用例,每個測試用例包含2行,第1行為一個長度不超過5的字串,第2行為一個長度不超過80的字串。注意這裡的字串包含空格,即空格也可能是要求被統計的字元之一。當讀到'#'時輸入結束,相應的結果不要輸出。 - 輸出
對每個測試用例,統計第1行中字串的每個字元在第2行字串中出現的次數,按如下格式輸出:
c0 n0
c1 n1
c2 n2
...
其中ci是第1行中第i個字元,ni是ci出現的次數。
#include <stdio.h> #include <string.h>
int main(){
char s1[6]; char s2[81]; int s1_length; int s2_length; int i; int j; int time; char c; while(1){
i=0; //s1包含空格
while((c=getchar())!='\n'){
s1[i]=c;
i++;
}
s1[i]='\0'; if(s1[0]=='#')
break;
i=0; //s2包含空格
while((c=getchar())!='\n'){
s2[i]=c;
i++;
}
s2[i]='\0';
s1_length=strlen(s1);
s2_length=strlen(s2); for(i=0;i<s1_length;i++){
time=0; for(j=0;j<s2_length;j++){ if(s1[i]==s2[j])
time++;
} printf("%c %d\n",s1[i],time);
}
} return 0;
}
完數
完數的定義:如果一個大於1的正整數的所有因子之和等於它的本身,則稱這個數是完數,比如6,28都是完數:6=1+2+3;28=1+2+4+7+14。
- 輸入
輸入資料包含多行,第一行是一個正整數n,表示測試例項的個數,然後就是n個測試例項,每個例項佔一行,由兩個正整數num1和num2組成,(1<num1,num2<10000) 。 - 輸出
對於每組測試資料,請輸出num1和num2之間(包括num1和num2)存在的完數個數。
#include <stdio.h>int if_perfect_number(int number);
int main(){
int T;
int number1;
int number2;
int temp;
int i;
int amount;
scanf("%d",&T);
while(T--){
amount=0;
scanf("%d%d",&number1,&number2);
if(number1>number2){
temp=number1;
number1=number2;
number2=temp;
}
for(i=number1;i<=number2;i++){
if(if_perfect_number(i)==1)
amount++;
}
printf("%d\n",amount);
} return 0;
}
int if_perfect_number(int number){
int i; int sum;
sum=0;
for(i=1;i<=number/2;i++){
if(number%i==0)
sum+=i;
} if(sum==number)
return 1; else
return 0;
}
素數迴文
xiaoou33對既是素數又是迴文的數特別感興趣。比如說151既是素數又是個迴文。現在xiaoou333想要你幫助他找出某個範圍內的素數迴文數,請你寫個程式找出 a 跟b 之間滿足條件的數。(5 <= a < b <= 100,000,000);
- 輸入
這裡有許多組資料,每組包括兩組資料a跟b。 - 輸出
對每一組資料,按從小到大輸出a,b之間所有滿足條件的素數迴文數(包括a跟b)每組資料之後空一行。
#include <stdio.h>#include <string.h>#include <math.h>#define N 10000000 //9999999是題目要求範圍的最大回文數char flag[N];int palindrome_number(int number);int main(){ int i; int j; int a; int b; memset(flag,'0',N);
flag[0]='1';
flag[1]='1'; for(i=2;i<=sqrt((double)N);i++){ if(flag[i]=='0'){ for(j=i*i;j<N;j+=i)
flag[j]='1';
}
} while(scanf("%d%d",&a,&b)!=EOF){ for(i=a;i<=b;i++){ if(i>N-1) continue; if(palindrome_number(i)==1 && flag[i]=='0') printf("%d\n",i);
} printf("\n");
} return 0;
}int palindrome_number(int number){ int array[9]; int i; int length; int flag;
i=0; while(number){ array[i]=number%10;
i++;
number/=10;
}
length=i;
flag=0; for(i=0;i<length/2;i++){ if(array[i]!=array[length-i-1]){
flag=1; break;
}
} if(flag==1) return 0; else
return 1;
}