c語言編程練習(xí)題

本次整理試題來源于:zqxLonely,再次感謝老師。

原文鏈接:https://bingyishow.top/Technical-article/16.html


練習(xí)題總覽

    第一部分
        韓信點兵
        蘭州燒餅
        進(jìn)制轉(zhuǎn)換
        第幾天?
        成績轉(zhuǎn)換
    第二部分
        求實數(shù)的絕對值。
        計算球體積
        兩點距離
        ASCII碼排序
        數(shù)值統(tǒng)計
    第三部分
        最小公倍數(shù)
        公約數(shù)和公倍數(shù)
        5個數(shù)求最值
        素數(shù)篩子算法
        分?jǐn)?shù)加減法
    第四部分
        第二小整數(shù)
        奇偶數(shù)分離
        奇偶位互換
        統(tǒng)計硬幣
        漢字統(tǒng)計
    第五部分
        偶數(shù)求和
        楊輝三角
        統(tǒng)計字符
        完數(shù)
        素數(shù)回文
    第六部分
        快速排序
        開門人和關(guān)門人
        雞兔同籠
        日期計算
        開燈問題
    第七部分
        字符串替換
        字母統(tǒng)計
        字符串逆序輸出
        交換輸出
        比較字母大小
    第八部分
        猴子吃桃問題
        九九乘法表
        16進(jìn)制的簡單運算
        三角形面積
        平方和與立方和
    第九部分
        水仙花數(shù)
        多項式求和
        絕對值排序
        首字母變大寫
        a/b + c/d

第一部分

韓信點兵

相傳韓信才智過人,從不直接清點自己軍隊的人數(shù),只要讓士兵先后以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總?cè)藬?shù)了。輸入3個非負(fù)整數(shù)a,b,c ,表示每種隊形排尾的人數(shù)(a<3,b<5,c<7),輸出總?cè)藬?shù)的最小值(或報告無解)。已知總?cè)藬?shù)不小于10,不超過100 。

  • 輸入
    輸入3個非負(fù)整數(shù)a,b,c ,表示每種隊形排尾的人數(shù)(a<3,b<5,c<7)。例如,輸入:2 4 5

  • 輸出
    輸出總?cè)藬?shù)的最小值(或報告無解,即輸出No answer)。實例,輸出:89

#include <stdio.h>

int main(){
    int a;
    int b;
    int c;
    int i;
    
    scanf("%d%d%d",&a,&b,&c);
    
    for(i=10;i<=100;i++){
        if(i%3==a && i%5==b && i%7==c){
            printf("%d\n",i);
            break;
        }
    }
    
    if(i==101)
        printf("No answer\n");
    
    
    return 0;
}

蘭州燒餅

燒餅有兩面,要做好一個蘭州燒餅,要兩面都弄熱。當(dāng)然,一次只能弄一個的話,效率就太低了。有這么一個大平底鍋,一次可以同時放入k個蘭州燒餅,一分鐘能做好一面。而現(xiàn)在有n個蘭州燒餅,至少需要多少分鐘才能全部做好呢?

  • 輸入
    依次輸入n和k,中間以空格分隔,其中1 <= k,n <= 100000

  • 輸出
    輸出全部做好至少需要的分鐘數(shù)

  • 提示
    如樣例,三個蘭州燒餅編號a,b,c,首先a和b,然后a和c,最后b和c,3分鐘完成

#include <stdio.h>

int main(){
    int n;
    int k;
    int total;
    int result;
    
    while(scanf("%d%d",&n,&k)!=EOF){
        total=n*2;
        
        if(total<k){  //沒有考慮到total<k的情況 
            printf("2\n");
            continue;
        }

        result=total/k;
    
        if(total%k!=0)
            result++;
        
        printf("%d\n",result);
    }
    
    return 0;
}

進(jìn)制轉(zhuǎn)換

輸入一個十進(jìn)制數(shù)N,將它轉(zhuǎn)換成R進(jìn)制數(shù)輸出。

  • 輸入
    輸入數(shù)據(jù)包含多個測試實例,每個測試實例包含兩個整數(shù)N(32位整數(shù))和R(2<=R<=16, R<>10)。

  • 輸出
    為每個測試實例輸出轉(zhuǎn)換后的數(shù),每個輸出占一行。如果R大于10,則對應(yīng)的數(shù)字規(guī)則參考16進(jìn)制(比如,10用A表示,等等)。

#include <stdio.h>

int main(){
    int number;
    int system;
    char s[50];
    int i;
    int length;
    int flag;
    
    while((scanf("%d%d",&number,&system))!=EOF){
        i=0;
        flag=0;
        
        if(number<0){
            number=-number;
            flag=1;
        }
        
        while(number){
            if(number%system<=9){
                s[i]=(number%system)+'0';
            }
            
            else if(number%system==10)
                s[i]='A';
                
            else if(number%system==11)
                s[i]='B';
            
            else if(number%system==12)
                s[i]='C';
                
            else if(number%system==13)
                s[i]='D';
                
            else if(number%system==14)
                s[i]='E';
                
            else if(number%system==15)
                s[i]='F';
                
            number/=system;
            i++;
        }
        length=i;
        
        if(flag==1)
            printf("-");
            
        for(i=length-1;i>=0;i--)
            printf("%c",s[i]);
            
        printf("\n");
        
        
        
    }
        
    
    return 0;
}

第幾天?

給定一個日期,輸出這個日期是該年的第幾天。

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,數(shù)據(jù)格式為YYYY/MM/DD組成,具體參見sample input ,另外,可以向你確保所有的輸入數(shù)據(jù)是合法的。

  • 輸出
    對于每組輸入數(shù)據(jù),輸出一行,表示該日期是該年的第幾天。

#include <stdio.h>
 
int main(){
    int a;
    int b;
    int c;
    int i;
    int day[13];
    int sum;
     
    day[1]=31;
    day[2]=28;
    day[3]=31;
    day[4]=30;
    day[5]=31;
    day[6]=30;
    day[7]=31;
    day[8]=31;
    day[9]=30;
    day[10]=31;
    day[11]=30;
    day[12]=31;
     
    while((scanf("%d/%d/%d",&a,&b,&c))!=EOF){
        sum=0;
         
        for(i=1;i<=b-1;i++)
            sum+=day[i];
             
        sum+=c;
         
        if((a%400==0 || (a%4==0 && a%100!=0)) && b>=3)
            sum++;
             
        printf("%d\n",sum);
    }
     
     
    return 0;
}

成績轉(zhuǎn)換

輸入一個百分制的成績M,將其轉(zhuǎn)換成對應(yīng)的等級,具體轉(zhuǎn)換規(guī)則如下:
90~100為A;
80~89為B;
70~79為C;
60~69為D;
0~59為E;

#include <stdio.h> 

int main(){
    int T;
    int n;
    char c;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d",&n);
        
        if(n>=90)
            c='A';
            
        else if(n>=80)
            c='B';
            
        else if(n>=70)
            c='C';
            
        else if(n>=60)
            c='D';
            
        else
            c='E';
            
        printf("%c\n",c);
    } 
    return 0;
}

第二部分

求實數(shù)的絕對值。

求實數(shù)的絕對值。

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,每行包含一個實數(shù)。
  • 輸出
    對于每組輸入數(shù)據(jù),輸出它的絕對值,要求每組數(shù)據(jù)輸出一行,結(jié)果保留兩位小數(shù)。
#include <stdio.h>
 
int main(){
    double number;
     
    while((scanf("%lf",&number)!=EOF)){
        if(number<0)
            number=-number;
             
        printf("%.2lf\n",number);
    }
    return 0;
}

計算球體積

根據(jù)輸入的半徑值,計算球的體積。

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,每行包括一個實數(shù),表示球的半徑。
  • 輸出
    輸出對應(yīng)的球的體積,對于每組輸入數(shù)據(jù),輸出一行,計算結(jié)果保留三位小數(shù)。
#include <stdio.h>
#define PI 3.1415927
 
int main(){
    double r;
    double result;
     
    while((scanf("%lf",&r))!=EOF){
        result=4.0*PI*r*r*r/3.0;
         
        printf("%.3lf\n",result);
    }
     
    return 0;
}

兩點距離

輸入兩點坐標(biāo)(X1,Y1),(X2,Y2)(0<=x1,x2,y1,y2<=1000),計算并輸出兩點間的距離。

  • 輸入
    第一行輸入一個整數(shù)n(0<n<=1000),表示有n組測試數(shù)據(jù);隨后每組占一行,由4個實數(shù)組成,分別表示x1,y1,x2,y2,數(shù)據(jù)之間用空格隔開。
  • 輸出
    對于每組輸入數(shù)據(jù),輸出一行,結(jié)果保留兩位小數(shù)。
#include <stdio.h> 
#include <math.h>

int main(){
    int T;
    double a;
    double b;
    double c;
    double d;
    double distance;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
        
        distance=sqrt((a-c)*(a-c)+(b-d)*(b-d));
        
        printf("%.2lf\n",distance);
    }
    return 0;
}

ASCII碼排序

輸入三個字符(可以重復(fù))后,按各字符的ASCII碼從小到大的順序輸出這三個字符。

  • 輸入
    第一行輸入一個數(shù)N,表示有N組測試數(shù)據(jù)。后面的N行輸入多組數(shù)據(jù),每組輸入數(shù)據(jù)都是占一行,有三個字符組成,之間無空格。
  • 輸出
    對于每組輸入數(shù)據(jù),輸出一行,字符中間用一個空格分開。
#include <stdio.h>

int main(){
    char a;
    char b;
    char c;
    char temp;
    int T;
    
    scanf("%d",&T);
    getchar();
    
    while(T--){
        scanf("%c%c%c",&a,&b,&c);
        getchar();
        
        if(a>b){
            temp=a;
            a=b;
            b=temp;
        }
        
        if(a>c){
            temp=a;
            a=c;
            c=temp;
        }
        
        if(b>c){
            temp=b;
            b=c;
            c=temp;
        }
        
        printf("%c %c %c\n",a,b,c);
    }
    return 0;
}

數(shù)值統(tǒng)計

統(tǒng)計給定的n個數(shù)中,負(fù)數(shù)、零和正數(shù)的個數(shù)。

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,每行的第一個數(shù)是整數(shù)n(n<100),表示需要統(tǒng)計的數(shù)值的個數(shù),然后是n個實數(shù);如果n=0,則表示輸入結(jié)束,該行不做處理。
  • 輸出
    對于每組輸入數(shù)據(jù),輸出一行a,b和c,分別表示給定的數(shù)據(jù)中負(fù)數(shù)、零和正數(shù)的個數(shù)。
#include <stdio.h>
 
int main(){
    int n;
    int i;
    int a;
    int b;
    int c;
    double number;
     
    while(1){
        a=0;
        b=0;
        c=0;
        scanf("%d",&n);
         
        if(n==0)
            break;
             
        for(i=0;i<n;i++){
            scanf("%lf",&number);
             
            if(number<0)
                a++;
                 
            else if(number==0)
                b++;
                 
            else
                c++;
        }
         
        printf("%d %d %d\n",a,b,c);
    }
    return 0;
}

第三部分

最小公倍數(shù)

給定兩個正整數(shù),計算這兩個數(shù)的最小公倍數(shù)。

  • 輸入
    輸入包含多組測試數(shù)據(jù),每組只有一行,包括兩個不大于1000的正整數(shù).
  • 輸出
    對于每個測試用例,給出這兩個數(shù)的最小公倍數(shù),每個實例輸出一行。
#include <stdio.h>
 
int get_LCM(int a,int b);
 
int main(){
    int a;
    int b;
     
    while((scanf("%d%d",&a,&b))!=EOF){
        printf("%d\n",get_LCM(a,b));
    }
     
    return 0;
}
 
int get_LCM(int a,int b){
    int temp;
    int remainder;
    int A;
    int B;
     
    A=a;
    B=b;
     
    if(a<b){
        temp=a;
        a=b;
        b=temp;
    }
     
    while(a%b){
        remainder=a%b;
        a=b;
        b=remainder;
    }
     
    return A*B/b;
}

公約數(shù)和公倍數(shù)

小明被一個問題給難住了,現(xiàn)在需要你幫幫忙。問題是:給出兩個正整數(shù),求出它們的最大公約數(shù)和最小公倍數(shù)。

  • 輸入
    第一行輸入一個整數(shù)n(0<n<=10000),表示有n組測試數(shù)據(jù);隨后的n行輸入兩個整數(shù)i,j(0<i,j<=32767)。
  • 輸出
    輸出每組測試數(shù)據(jù)的最大公約數(shù)和最小公倍數(shù)
#include <stdio.h>

int main(){
    int a;
    int b;
    int temp;
    int T;
    int a_save;
    int b_save;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d%d",&a,&b);
        
        if(a<b){
            temp=a;
            a=b;
            b=temp;
        }
        
        a_save=a;
        b_save=b;
        while(a%b!=0){
            temp=a%b;
            a=b;
            b=temp;
        }
        
        printf("%d %d\n",b,a_save*b_save/b);
    }    
    return 0;
}

5個數(shù)求最值

設(shè)計一個從5個整數(shù)中取最小數(shù)和最大數(shù)的程序

  • 輸入
    輸入只有一組測試數(shù)據(jù),為五個不大于1萬的正整數(shù)
  • 輸出
    輸出兩個數(shù),第一個為這五個數(shù)中的最小值,第二個為這五個數(shù)中的最大值,兩個數(shù)字以空格格開。
#include <stdio.h>

int main(){
    int number;
    int min;
    int max;
    int i;
    
    for(i=0;i<5;i++){
        scanf("%d",&number);
        
        if(i==0){
            min=number;
            max=number;
            continue;
        }
        
        if(number<min)
            min=number;
            
        if(number>max)
            max=number;
    }
    
    printf("%d %d\n",min,max);
    
    return 0;
}

素數(shù)篩子算法

現(xiàn)在給你一個正整數(shù)N,要你快速的找出在2.....N這些數(shù)里面所有的素數(shù)。

  • 輸入
    給出一個正整數(shù)數(shù)N(N<=2000000)、但N為0時結(jié)束程序。、測試數(shù)據(jù)不超過100組
  • 輸出
    將2~N范圍內(nèi)所有的素數(shù)輸出。兩個數(shù)之間用空格隔開
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 2000001
  
int main(){
    int i;
    int j;
    char flag[N];
    memset(flag,'0',N);
    flag[0]='1';
    flag[1]='1';
  
    for(i=2;i<=sqrt(N);i++){
        if(flag[i]=='0'){
            for(j=i*i;j<N;j+=i){
                flag[j]='1';
            }
        }
    }
  
    int number;
      
    while(1){
        scanf("%d",&number);
  
        if(number==0)
            break;
  
        for(i=2;i<=number;i++){
            if(flag[i]=='0')
                printf("%d ",i);
        }
              
        printf("\n");
    }
  
    return 0;
}

分?jǐn)?shù)加減法

編寫一個C程序,實現(xiàn)兩個分?jǐn)?shù)的加減法

  • 輸入

輸入包含多行數(shù)據(jù)
每行數(shù)據(jù)是一個字符串,格式是"a/boc/d"。
其中a, b, c, d是一個0-9的整數(shù)。o是運算符"+"或者"-"。
數(shù)據(jù)以EOF結(jié)束
輸入數(shù)據(jù)保證合法

  • 輸出
    對于輸入數(shù)據(jù)的每一行輸出兩個分?jǐn)?shù)的運算結(jié)果。 注意結(jié)果應(yīng)符合書寫習(xí)慣,沒有多余的符號、分子、分母,并且化簡至最簡分?jǐn)?shù)
#include <stdio.h> 

int gcd(int a,int b);

int main(){
    int a;
    int b;
    int c;
    int d;
    char sign;
    int fenmu;
    int fenzi;
    char temp;
    
    while(scanf("%d/%d%c%d/%d",&a,&b,&sign,&c,&d)!=EOF){
        fenmu=b*d/gcd(b,d);
        
        if(sign=='+')
            fenzi=a*fenmu/b+c*fenmu/d;
        
        else
            fenzi=a*fenmu/b-c*fenmu/d;
            
        if(fenzi==0){  //分子為0直接輸出0 
            printf("0\n");
            continue;
        }
        
        temp='+';
        if(fenzi<0){  //當(dāng)為負(fù)數(shù)時,化為正數(shù),標(biāo)記負(fù)號 
            fenzi=-fenzi;
            temp='-';
        }
        
        if(temp=='-')  //有負(fù)號時輸出負(fù)號 
            printf("-");
        
        if(fenzi%fenmu==0)  //如果整除時直接輸出商 
            printf("%d\n",fenzi/fenmu);
            
        else   //不整除時以分?jǐn)?shù)的形式輸出 
            printf("%d/%d\n",fenzi/gcd(fenmu,fenzi),fenmu/gcd(fenmu,fenzi));
    }
    return 0;
}

int gcd(int a,int b){
    int temp;
    
    if(a<b){
        temp=a;
        a=b;
        b=temp;
    }
    
    while(a%b!=0){
        temp=a%b;
        a=b;
        b=temp;
    }
    
    return b;
}

第四部分

第二小整數(shù)

求n個整數(shù)中倒數(shù)第二小的數(shù)。每一個整數(shù)都獨立看成一個數(shù),比如,有三個數(shù)分別是1,1,3,那么,第二小的數(shù)就是1。

  • 輸入

輸入包含多組測試數(shù)據(jù)。
輸入的第一行是一個整數(shù)C,表示有C測試數(shù)據(jù);
每組測試數(shù)據(jù)的第一行是一個整數(shù)n,表示本組測試數(shù)據(jù)有n個整數(shù)(2<=n<=10),接著一行是 n個整數(shù) (每個數(shù)均小于100);

  • 輸出
    請為每組測試數(shù)據(jù)輸出第二小的整數(shù),每組輸出占一行。
#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;
}

奇偶數(shù)分離

有一個整型偶數(shù)n(2<= n <=10000),你要做的是:先把1到n中的所有奇數(shù)從小到大輸出,再把所有的偶數(shù)從小到大輸出。

  • 輸入
    第一行有一個整數(shù)i(2<=i<30)表示有 i 組測試數(shù)據(jù);每組有一個整型偶數(shù)n。
  • 輸出
    第一行輸出所有的奇數(shù)。第二行輸出所有的偶數(shù)
#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;
}

奇偶位互換

給定一個長度為偶數(shù)位的0,1字符串,請編程實現(xiàn)串的奇偶位互換。

  • 輸入

輸入包含多組測試數(shù)據(jù);
輸入的第一行是一個整數(shù)C,表示有C測試數(shù)據(jù);
接下來是C組測試數(shù)據(jù),每組數(shù)據(jù)輸入均為0,1字符串,保證串長為偶數(shù)位(串長<=50)。

  • 輸出
    請為每組測試數(shù)據(jù)輸出奇偶位互換后的結(jié)果;每組輸出占一行。
#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;
}

統(tǒng)計硬幣

假設(shè)一堆由1分、2分、5分組成的n個硬幣總面值為m分,求一共有多少種可能的組合方式(某種面值的硬幣可以數(shù)量可以為0)。

  • 輸入
    輸入數(shù)據(jù)第一行有一個正整數(shù)T,表示有T組測試數(shù)據(jù);接下來的T行,每行有兩個數(shù)n,m,n和m的含義同上。
  • 輸出
    對于每組測試數(shù)據(jù),請輸出可能的組合方式數(shù);每組輸出占一行。
#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;
}

漢字統(tǒng)計

統(tǒng)計給定文本文件中漢字的個數(shù)。

  • 輸入
    輸入文件首先包含一個整數(shù)n,表示測試實例的個數(shù),然后是n段文本。
  • 輸出
    對于每一段文本,輸出其中的漢字的個數(shù),每個測試實例的輸出占一行。
#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;
}

第五部分

偶數(shù)求和

有一個長度為n(n<=100)的數(shù)列,該數(shù)列定義為從2開始的遞增有序偶數(shù),現(xiàn)在要求你按照順序每m個數(shù)求出一個平均值,如果最后不足m個,則以實際數(shù)量求平均值。編程輸出該平均值序列。

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,包含兩個正整數(shù)n和m,n和m的含義如上所述。
  • 輸出
    對于每組輸入數(shù)據(jù),輸出一個平均值序列,每組輸出占一行。
#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;
}

楊輝三角

還記得中學(xué)時候?qū)W過的楊輝三角嗎?具體的定義這里不再描述,你可以參考以下的圖形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

  • 輸入
    輸入數(shù)據(jù)包含多個測試實例,每個測試實例的輸入只包含一個正整數(shù)n(1<=n<=30),表示將要輸出的楊輝三角的層數(shù)。
  • 輸出
    對應(yīng)于每一個輸入,請輸出相應(yīng)層數(shù)的楊輝三角,每一層的整數(shù)之間用一個空格隔開,每一個楊輝三角后面加一個空行。
#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;
}

統(tǒng)計字符

統(tǒng)計一個給定字符串中指定的字符出現(xiàn)的次數(shù)

  • 輸入
    測試輸入包含若干測試用例,每個測試用例包含2行,第1行為一個長度不超過5的字符串,第2行為一個長度不超過80的字符串。注意這里的字符串包含空格,即空格也可能是要求被統(tǒng)計的字符之一。當(dāng)讀到'#'時輸入結(jié)束,相應(yīng)的結(jié)果不要輸出。

  • 輸出

對每個測試用例,統(tǒng)計第1行中字符串的每個字符在第2行字符串中出現(xiàn)的次數(shù),按如下格式輸出:
c0 n0
c1 n1
c2 n2
...
其中ci是第1行中第i個字符,ni是ci出現(xiàn)的次數(shù)。

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

完數(shù)

完數(shù)的定義:如果一個大于1的正整數(shù)的所有因子之和等于它的本身,則稱這個數(shù)是完數(shù),比如6,28都是完數(shù):6=1+2+3;28=1+2+4+7+14。

  • 輸入
    輸入數(shù)據(jù)包含多行,第一行是一個正整數(shù)n,表示測試實例的個數(shù),然后就是n個測試實例,每個實例占一行,由兩個正整數(shù)num1和num2組成,(1<num1,num2<10000) 。
  • 輸出
    對于每組測試數(shù)據(jù),請輸出num1和num2之間(包括num1和num2)存在的完數(shù)個數(shù)。
#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;
}

素數(shù)回文

xiaoou33對既是素數(shù)又是回文的數(shù)特別感興趣。比如說151既是素數(shù)又是個回文。現(xiàn)在xiaoou333想要你幫助他找出某個范圍內(nèi)的素數(shù)回文數(shù),請你寫個程序找出 a 跟b 之間滿足條件的數(shù)。(5 <= a < b <= 100,000,000);

  • 輸入
    這里有許多組數(shù)據(jù),每組包括兩組數(shù)據(jù)a跟b。
  • 輸出
    對每一組數(shù)據(jù),按從小到大輸出a,b之間所有滿足條件的素數(shù)回文數(shù)(包括a跟b)每組數(shù)據(jù)之后空一行。
#include <stdio.h>
#include <string.h>
#include <math.h>

#define N 10000000   //9999999是題目要求范圍的最大回文數(shù)
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;
}

第六部分

快速排序

給你n個整數(shù),請按從大到小的順序輸出其中前m大的數(shù)。

  • 輸入
    每組測試數(shù)據(jù)有兩行,第一行有兩個數(shù)n,m(0<n,m<1000000),第二行包含n個各不相同,且都處于區(qū)間[-500000,500000]的整數(shù)。
  • 輸出
    對每組測試數(shù)據(jù)按從大到小的順序輸出前m大的數(shù)。
#include <stdio.h>

void quickSort(int a[],int left,int right);
int array[1000001];

int main(){
    int n;
    int m;
    int i;
    
    while(scanf("%d%d",&n,&m)!=EOF){
        for(i=0;i<n;i++)
            scanf("%d",&array[i]);
            
        quickSort(array,0,n-1);
        
        for(i=n-1;i>n-m-1;i--){
            if(i==n-1)
                printf("%d",array[i]);
                
            else
                printf(" %d",array[i]);
        }
        
        printf("\n");
    }
    
    return 0;
}

void quickSort(int a[],int left,int right){
    int i;
    int j;
    int temp;
    
    i=left;
    j=right;
    temp=a[left];
    
    if(left>=right)
        return;
        
    while(i!=j){
        while(i<j && a[j]>=temp)
            j--;
            
        if(i<j){
            a[i]=a[j];
        }
            
            
        while(i<j && a[i]<=temp)
             i++;
             
        if(i<j){
            a[j]=a[i];
        }
    }
    a[i]=temp;
    
    quickSort(a,left,i-1);
    quickSort(a,i+1,right);    
}

開門人和關(guān)門人

每天第一個到機房的人要把門打開,最后一個離開的人要把門關(guān)好。現(xiàn)有一堆雜亂的機房簽
到、簽離記錄,請根據(jù)記錄找出當(dāng)天開門和關(guān)門的人。

  • 輸入

測試輸入的第一行給出記錄的總天數(shù)N ( > 0 )。下面列出了N天的記錄。
每天的記錄在第一行給出記錄的條目數(shù)M ( > 0 ),下面是M行,每行的格式為

證件號碼 簽到時間 簽離時間

其中時間按“小時:分鐘:秒鐘”(各占2位)給出,證件號碼是長度不超過15的字符串。

  • 輸出

對每一天的記錄輸出1行,即當(dāng)天開門和關(guān)門人的證件號碼,中間用1空格分隔。
注意:在裁判的標(biāo)準(zhǔn)測試輸入中,所有記錄保證完整,每個人的簽到時間在簽離時間之前,
且沒有多人同時簽到或者簽離的情況。

#include <stdio.h>
#include <string.h>

int main(){
    int N;
    int M;
    int i;
    char ID[16];
    char minID[16];
    char maxID[16];
    char s1[9];
    char s2[9];
    char time1[7];
    char time2[7];
    char minTime[7];
    char maxTime[7];

    scanf("%d",&N);

    while(N--){
        scanf("%d",&M);

        for(i=0;i<M;i++){
            scanf("%s%s%s",ID,s1,s2);
            time1[0]=s1[0];
            time1[1]=s1[1];
            time1[2]=s1[3];
            time1[3]=s1[4];
            time1[4]=s1[6];
            time1[5]=s1[7];
            time1[6]='\0';

            time2[0]=s2[0];
            time2[1]=s2[1];
            time2[2]=s2[3];
            time2[3]=s2[4];
            time2[4]=s2[6];
            time2[5]=s2[7];
            time2[6]='\0';

            if(i==0){
                strcpy(minID,ID);
                strcpy(maxID,ID);
                strcpy(minTime,time1);
                strcpy(maxTime,time2);
                continue;
            }

            if(strcmp(time1,minTime)<0){
                strcpy(minID,ID);
                strcpy(minTime,time1);
            }

            if(strcmp(time2,maxTime)>0){
                strcpy(maxID,ID);
                strcpy(maxTime,time2);
            }
        }

        printf("%s %s\n",minID,maxID);


    }
    
    
    return 0;
}

雞兔同籠

已知雞和兔的總數(shù)量為n,總腿數(shù)為m。輸入n和m,依次輸出雞和兔的數(shù)目,如果無解,則輸出“No answer”(不要引號)。

  • 輸入
    第一行輸入一個數(shù)據(jù)a,代表接下來共有幾組數(shù)據(jù),在接下來的(a<10)、a行里,每行都有一個n和m.(0<m,n<100)
  • 輸出
    輸出雞兔的個數(shù),或者No answer
#include <stdio.h> 

int main(){
    int T;
    int n;
    int m;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d%d",&n,&m);
        
        if((m-2*n)>=0 && (m-2*n)%2==0 && (4*n-m)>=0 && (4*n-m)%2==0)
            printf("%d %d\n",(4*n-m)/2,(m-2*n)/2);
            
        else
            printf("No answer\n");    
    }
    return 0;
}

日期計算

如題,輸入一個日期,格式如:2010 10 24 ,判斷這一天是這一年中的第幾天。

  • 輸入
    第一行輸入一個數(shù)N(0<N<=100),表示有N組測試數(shù)據(jù)。后面的N行輸入多組輸入數(shù)據(jù),每行的輸入數(shù)據(jù)都是一個按題目要求格式輸入的日期。
  • 輸出
    每組輸入數(shù)據(jù)的輸出占一行,輸出判斷出的天數(shù)n
#include <stdio.h> 

int main(){
    int T;
    int a;
    int b;
    int c;
    int i;
    int day[13];
    int amount;
    
    day[1]=31;
    day[2]=28;
    day[3]=31;
    day[4]=30;
    day[5]=31;
    day[6]=30;
    day[7]=31;
    day[8]=31;
    day[9]=30;
    day[10]=31;
    day[11]=30;
    day[12]=31;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d%d%d",&a,&b,&c);
        
        amount=0;
        for(i=1;i<b;i++)
            amount+=day[i];
        amount+=c;
        
        if((a%400==0 || (a%4==0 && a%100!=0)) && i>=3)
            amount++;
            
        printf("%d\n",amount);
    }
    return 0;
}

開燈問題

有n盞燈,編號為1~n,第1個人把所有燈打開,第2個人按下所有編號為2 的倍數(shù)的開關(guān)(這些燈將被關(guān)掉),第3 個人按下所有編號為3的倍數(shù)的開關(guān)(其中關(guān)掉的燈將被打開,開著的燈將被關(guān)閉),依此類推。一共有k個人,問最后有哪些燈開著?輸入:n和k,輸出開著的燈編號。k≤n≤1000

  • 輸入
    輸入一組數(shù)據(jù):n和k
  • 輸出
    輸出開著的燈編號
#include <stdio.h> 
#include <string.h>

int main(){
    int n;
    int k;
    int flag[1001];
    int i;
    int j;
    
    scanf("%d%d",&n,&k);
    memset(flag,0,sizeof(int)*1001);
    
    for(i=1;i<=k;i++){
        for(j=1;j<=n;j++){
            if(j%i==0){
                if(flag[j-1]==0)
                    flag[j-1]=1;
                    
                else
                    flag[j-1]=0;
            }
        }
    }
    
    for(i=0;i<n;i++){
        if(flag[i]==1){
            printf("%d",i+1);
            flag[i]=0;
            break;
        }
    }
    
    for(i=0;i<n;i++){
        if(flag[i]==1)
            printf(" %d",i+1);
    }
    
    printf("\n");
    
    return 0;
}

第七部分

字符串替換

編寫一個程序?qū)崿F(xiàn)將字符串中的所有"you"替換成"we"

  • 輸入

輸入包含多行數(shù)據(jù)
每行數(shù)據(jù)是一個字符串,長度不超過1000
數(shù)據(jù)以EOF結(jié)束

  • 輸出
    對于輸入的每一行,輸出替換后的字符串
#include <stdio.h> 
#include <string.h>

int main(){
    char c;
    char s[1001];
    int i;
    int length;
    
    while(scanf("%c",&c)!=EOF){
        i=0;
        while(c!='\n'){
            s[i]=c;
            i++;
            c=getchar();
        }
        s[i]='\0';
        length=strlen(s);
        
        for(i=0;i<length-2;i++){  //這里處理很巧妙,直接賦值即可,真是高 
            if(s[i]=='y' && s[i+1]=='o' && s[i+2]=='u'){
                s[i]='w';
                s[i+1]='e';
                s[i+2]='\0';  //賦值為'\0',是因為其他位置的字符不可能為'\0'   
            }        
        }
        
        for(i=0;i<length;i++){
            if(s[i]!='\0')
                printf("%c",s[i]);
        }
            
        printf("\n");
    }    
    return 0;
}

字母統(tǒng)計

現(xiàn)在給你一個由小寫字母組成字符串,要你找出字符串中出現(xiàn)次數(shù)最多的字母,如果出現(xiàn)次數(shù)最多字母有多個那么輸出最小的那個。

  • 輸入
    第一行輸入一個正整數(shù)T(0<T<25)隨后T行輸入一個字符串s,s長度小于1010。
  • 輸出
    每組數(shù)據(jù)輸出占一行,輸出出現(xiàn)次數(shù)最多的字符;
#include <stdio.h> 
#include <string.h>

int main(){
    char s[1100];
    int T;
    int amount[27];
    int i;
    int max;
    char c;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%s",&s);
        
        memset(amount,0,sizeof(int)*27);
        
        for(i=0;s[i]!='\0';i++){
            amount[s[i]-'a'+1]++;
        }
        
        for(i=1;i<=26;i++){
            if(amount[i]!=0){
                c=i-1+'a';
                max=amount[i];
                break;
            }
        }
        
        for(i=1;i<=26;i++){
            if(amount[i]>max){
                c=i-1+'a';
                max=amount[i];
            }
        }
        
        printf("%c\n",c);
    }
    return 0;
}

字符串逆序輸出

給定一行字符,逆序輸出此行(空格.數(shù)字不輸出)

  • 輸入

第一行是一個整數(shù)N(N<10)表示測試數(shù)據(jù)的組數(shù))
每組測試數(shù)據(jù)占一行,每行數(shù)據(jù)中間有且只有一個空格(這樣你可以把此行當(dāng)成兩個字符串讀取)。
每行字符長度不超過40
并且保證輸入的字符只有空格(1個),數(shù)字,小寫字母三種

  • 輸出
    對應(yīng)每行測試數(shù)據(jù),逆序輸出(空格和數(shù)字不輸出)
#include <stdio.h> 
#include <string.h>
#include <ctype.h>

int main(){
    char s[50];
    int T;
    int length;
    int i;
    
    scanf("%d",&T);
    getchar();
    
    while(T--){
        gets(s);
        length=strlen(s);
        
        for(i=length-1;i>=0;i--){
            if(isalpha(s[i]))
                printf("%c",s[i]);
        }
        
        printf("\n");
    }
    return 0;
}

交換輸出

輸入n(n<100)個數(shù),找出其中最小的數(shù),將它與最前面的數(shù)交換后輸出這些數(shù)。(如果這個第一個數(shù)就是最小的數(shù),則保持原樣輸出,如果最小的數(shù)有相同的按照前面的交換)

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,每行的開始是一個整數(shù)n,表示這個測試實例的數(shù)值的個數(shù),跟著就是n個整數(shù)。n=0表示輸入的結(jié)束,不做處理。
  • 輸出
    對于每組輸入數(shù)據(jù),輸出交換后的數(shù)列,每組輸出占一行。
#include <stdio.h> 

int main(){
    int n;
    int number[101];
    int i;
    int min;
    int flag;
    int temp;
    
    while(1){
        scanf("%d",&n);
        
        if(n==0)
            break;
            
        for(i=0;i<n;i++)
            scanf("%d",&number[i]);
            
        flag=0;
        min=number[0];
        
        for(i=0;i<n;i++){
            if(number[i]<min){
                min=number[i];
                flag=i;
            }
        }
        
        temp=number[0];
        number[0]=number[flag];
        number[flag]=temp;
        
        for(i=0;i<n;i++){
            if(i!=0)
                printf(" ");
                
            printf("%d",number[i]);
        }
        printf("\n");
    }
    return 0;
}

比較字母大小

任意給出兩個英文字母,比較它們的大小,規(guī)定26個英文字母A,B,C.....Z依次從大到小。

  • 輸入
    第一行輸入T,表示有T組數(shù)據(jù);接下來有T行,每行有兩個字母,以空格隔開;
  • 輸出
    輸出各組數(shù)據(jù)的比較結(jié)果,輸出格式見樣例輸出;(注意輸出嚴(yán)格按照輸入的順序即輸入是A B,輸出時必須是A?B)
#include <stdio.h> 

int main(){
    int T;
    char a;
    char b;
    char compare;
    
    scanf("%d",&T);
    getchar();
    
    while(T--){
        scanf("%c %c",&a,&b);
        getchar();
        
        if(a==b)
            compare='=';
            
        else if(a>b)
            compare='<';
            
        else
            compare='>';
            
        printf("%c%c%c\n",a,compare,b);
    }
    return 0;
}

第八部分

猴子吃桃問題

有一堆桃子不知數(shù)目,猴子第一天吃掉一半,又多吃了一個,第二天照此方法,吃掉剩下桃子的一半又多一個,天天如此,到第m天早上,猴子發(fā)現(xiàn)只剩一只桃子了,問這堆桃子原來有多少個? (m<29)

  • 輸入
    第一行有一個整數(shù)n,表示有n組測試數(shù)據(jù)(從第二行開始,每一行的數(shù)據(jù)為:第m天);
  • 輸出
    每一行數(shù)據(jù)是桃子的總個數(shù)
#include <stdio.h> 

int main(){
    int T;
    int m;
    int i;
    int result;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d",&m);
        
        result=1;
        for(i=1;i<=m;i++)
            result=(result+1)*2;
            
        printf("%d\n",result);    
    }
    return 0;
}

九九乘法表

小時候?qū)W過的九九乘法表也許將會扎根于我們一生的記憶,現(xiàn)在讓我們重溫那些溫暖的記憶,請編程輸出九九乘法表.
現(xiàn)在要求你輸出它的格式與平常的 不同啊! 是那種反過來的三角形啦,具體如下圖:
每兩個式子之前用一個空格 隔開。。。

  • 輸入
    第一有一個整數(shù)N,表示有N組數(shù)據(jù)(N<10)接下來由N行,每行只有一個整數(shù)M(1<=M<=9);
  • 輸出
    對應(yīng)每個整數(shù)M,根據(jù)要求輸出乘法表的前N行,具體格式參見輸入輸出樣例和上圖.每兩組測試數(shù)據(jù)結(jié)果之間有一個空行隔開,
#include <stdio.h>
#include <math.h>

int main(){
    int T;
    int n;
    int i;
    int j;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d",&n);
        
        for(i=1;i<=n;i++){
            for(j=i;j<=9;j++){
                if(j!=i)
                    printf(" ");
                
                printf("%d*%d=%d",i,j,i*j);
            }
            printf("\n");
        }
        
        if(T!=0)
            printf("\n");    
    }
    return 0;
}

16進(jìn)制的簡單運算

現(xiàn)在給你一個16進(jìn)制的加減法的表達(dá)式,要求用8進(jìn)制輸出表達(dá)式的結(jié)果。

  • 輸入

第一行輸入一個正整數(shù)T(0<T<100000)
接下來有T行,每行輸入一個字符串s(長度小于15)字符串中有兩個數(shù)和一個加號或者一個減號,且表達(dá)式合法并且所有運算的數(shù)都小于31位

  • 輸出
    每個表達(dá)式輸出占一行,輸出表達(dá)式8進(jìn)制的結(jié)果。
#include <stdio.h>

int main(){
    int a;
    int b;
    int sum;
    int T;
    char c;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%x%c%x",&a,&c,&b);
        
        if(c=='+')
            sum=a+b;
            
        else
            sum=a-b;
            
        if(sum<0){   //只有當(dāng)sum為__int64類型時,才要進(jìn)行正負(fù)的判斷
            sum=-sum;
            printf("-");
        }
        
        printf("%o\n",sum);
    }
    
    
    
    return 0;
}

三角形面積

給你三個點,表示一個三角形的三個頂點,現(xiàn)你的任務(wù)是求出該三角形的面積

  • 輸入
    每行是一組測試數(shù)據(jù),有6個整數(shù)x1,y1,x2,y2,x3,y3分別表示三個點的橫縱坐標(biāo)。(坐標(biāo)值都在0到10000之間)輸入0 0 0 0 0 0表示輸入結(jié)束。測試數(shù)據(jù)不超過10000組
  • 輸出
    輸出這三個點所代表的三角形的面積,結(jié)果精確到小數(shù)點后1位(即使是整數(shù)也要輸出一位小數(shù)位)
#include <stdio.h>
#include <math.h>

int main(){
    int x1;
    int y1;
    int x2;
    int y2;
    int x3;
    int y3;
    double s;
    
    while(1){
        scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
        
        if(x1==0 && y1==0 && x2==0 && y2==0 && x3==0 && y3==0)
            break;
                
        s=fabs((double)x1*y2-x2*y1+x3*y1-x1*y3+x2*y3-x3*y2)/2;
    
        printf("%.1lf\n",s);
    }
    
    return 0;
}

平方和與立方和

給定一段連續(xù)的整數(shù),求出他們中所有偶數(shù)的平方和以及所有奇數(shù)的立方和。

  • 輸入
    輸入數(shù)據(jù)包含多組測試實例,每組測試實例包含一行,由兩個整數(shù)m和n組成。
  • 輸出
    對于每組輸入數(shù)據(jù),輸出一行,應(yīng)包括兩個整數(shù)x和y,分別表示該段連續(xù)的整數(shù)中所有偶數(shù)的平方和以及所有奇數(shù)的立方和。你可以認(rèn)為32位整數(shù)足以保存結(jié)果。
#include <stdio.h>
 
int main(){
    int a;
    int b;
    int i;
    int temp;
    int oushu_sum;
    int jishu_sum;
     
    while((scanf("%d%d",&a,&b))!=EOF){
        oushu_sum=0;
        jishu_sum=0;
         
        if(a>b){
            temp=a;
            a=b;
            b=temp;
        }
         
        for(i=a;i<=b;i++){
            if(i%2==0){
                oushu_sum+=(i*i);
            }
             
            else
                jishu_sum+=(i*i*i);
        }
         
        printf("%d %d\n",oushu_sum,jishu_sum);
    }
     
    return 0;
}

第九部分

水仙花數(shù)

春天是鮮花的季節(jié),水仙花就是其中最迷人的代表,數(shù)學(xué)上有個水仙花數(shù),他是這樣定義的:

“水仙花數(shù)”是指一個三位數(shù),它的各位數(shù)字的立方和等于其本身,比如:153=13+53+3^3。

現(xiàn)在要求輸出所有在m和n范圍內(nèi)的水仙花數(shù)。

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,包括兩個整數(shù)m和n(100<=m<=n<=999)。
  • 輸出

對于每個測試實例,要求輸出所有在給定范圍內(nèi)的水仙花數(shù),就是說,輸出的水仙花數(shù)必須大于等于m,并且小于等于n,如果有多個,則要求從小到大排列在一行內(nèi)輸出,之間用一個空格隔開;
如果給定的范圍內(nèi)不存在水仙花數(shù),則輸出no;
每個測試實例的輸出占一行。

#include <stdio.h>
 
int main(){
    int a;
    int b;
    int temp;
    int i;
     
    int number1;
    int number2;
    int number3;
    int flag;
     
    while((scanf("%d%d",&a,&b))!=EOF){
        flag=0;
        if(a>b){
            temp=a;
            a=b;
            b=temp;
        }
         
        for(i=a;i<=b;i++){
            number1=i%10;
            number2=i/10%10;
            number3=i/100;
             
            if(i==(number1*number1*number1+number2*number2*number2+number3*number3*number3)){
                if(flag==0)
                    printf("%d",i);
                     
                else
                    printf(" %d",i);
                flag=1;
            }
        }
         
        if(flag==0)
            printf("no");
             
        printf("\n");
    }
     
    return 0;
}

多項式求和

多項式的描述如下:

1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...

現(xiàn)在請你求出該多項式的前n項的和。

  • 輸入
    輸入數(shù)據(jù)由2行組成,首先是一個正整數(shù)m(m<100),表示測試實例的個數(shù),第二行包含m個正整數(shù),對于每一個整數(shù)(不妨設(shè)為n,n<1000),求該多項式的前n項的和。
  • 輸出
    對于每個測試實例n,要求輸出多項式前n項的和。每個測試實例的輸出占一行,結(jié)果保留2位小數(shù)。
#include <stdio.h>
 
double get_result(int number);
 
int main(){
    int n;
    int number;
     
    scanf("%d",&n);
     
    while(n--){
        scanf("%d",&number);
         
        printf("%.2lf\n",get_result(number));
    }
     
    return 0;
}
 
double get_result(int number){
    int i;
    int temp=1;
    double result=0;
     
    for(i=1;i<=number;i++){
        result+=(1.0/i*temp);
        temp=-temp;
    }
     
    return result;
}

絕對值排序

輸入n(n<=100)個整數(shù),按照絕對值從大到小排序后輸出。題目保證對于每一個測試實例,所有的數(shù)的絕對值都不相等。

  • 輸入
    輸入數(shù)據(jù)有多組,每組占一行,每行的第一個數(shù)字為n,接著是n個整數(shù),n=0表示輸入數(shù)據(jù)的結(jié)束,不做處理
  • 輸出
    對于每個測試實例,輸出排序后的結(jié)果,兩個數(shù)之間用一個空格隔開。每個測試實例占一行。
#include <stdio.h>
#include <math.h>
 
int main(){
    int n;
    int number[101];
    int i;
    int j;
    int temp;
     
    while(1){
        scanf("%d",&n);
         
        if(n==0)
            break;
             
        for(i=0;i<n;i++)
            scanf("%d",&number[i]);
             
        for(i=0;i<n-1;i++){
            for(j=i+1;j<n;j++){
                if(fabs(number[i])<(fabs(number[j]))){
                    temp=number[i];
                    number[i]=number[j];
                    number[j]=temp;
                }
            }
        }
         
        for(i=0;i<n;i++){
            printf("%d",number[i]);
             
            if(i!=n-1)
                printf(" ");
        }
         
        printf("\n");
         
    }
     
         
    return 0;
}

首字母變大寫

輸入一個英文句子,將每個單詞的第一個字母改成大寫字母。

  • 輸入
    輸入數(shù)據(jù)包含多個測試實例,每個測試實例是一個長度不超過100的英文句子,占一行。
  • 輸出
    請輸出按照要求改寫后的英文句子。
#include <stdio.h>
#include <ctype.h>
 
int main(){
    char c;
    int flag;
     
    while((scanf("%c",&c))!=EOF){
        flag=1;
         
        while(c!='\n'){
            if(islower(c)!=0 && flag==1){
                c=toupper(c);
                flag=0;
            }
             
                 
            if(c==' ')
                flag=1;
             
            printf("%c",c);
             
            c=getchar();
        }
         
        printf("\n");
    }
             
    return 0;
}

a/b + c/d

給你2個分?jǐn)?shù),求他們的和,并要求和為最簡形式。

  • 輸入
    輸入首先包含一個正整數(shù)T(T<=1000),表示有T組測試數(shù)據(jù),然后是T行數(shù)據(jù),每行包含四個正整數(shù)a,b,c,d(0<a,b,c,d<1000),表示兩個分?jǐn)?shù)a/b 和 c/d。
  • 輸出
    對于每組測試數(shù)據(jù),輸出兩個整數(shù)e和f,表示a/b + c/d的最簡化結(jié)果是e/f,每組輸出占一行。
#include <stdio.h>

int get_gcd(int a,int b);

int main(){
    int T;
    int a;
    int b;
    int c;
    int d;
    int lcm;
    int temp;
    int gcd;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d%d%d%d",&a,&b,&c,&d);
        lcm=b*d/get_gcd(b,d);
        
        temp=(lcm/b*a+lcm/d*c);
        gcd=get_gcd(temp,lcm);
        
        printf("%d %d\n",temp/gcd,lcm/gcd);    
    }        
    return 0;
}

int get_gcd(int a,int b){
    int temp;
    int remainder;
    
    if(a<b){
        temp=a;
        a=b;
        b=temp;
    }
    
    while(a%b){
        remainder=a%b;
        
        a=b;
        b=remainder;
    }
    
    return b;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。