1. 程式人生 > >C語言練習題(一)

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;

}