• 洛谷学习


    P5708 三角形面积

    这道题有个注意点是关于变量类型的选择,如果选择的是float类型,答案将是错误的,double类型才是正确的。因为double类型float类型更加精确。如图:

    可以看到float类型的值为1333.320068,而double类型的值为1333.320002。代码如下:

    #include<stdio.h>
    #include<math.h>
    
    int main(void){
        float a,b,c;
        float p;
        float area;
        scanf("%f %f %f",&a,&b,&c);
        P=(A+B+c)/2;
        area=sqrt(p*(p-a)*(p-b)*(p-c));
        printf("%0.1f",area);
    }
    

    P5709 Apples Prologue

    这道题应该关注m,t,s为0的情况时的讨论,还有关于吃完所有苹果花的时间是否比过去的时间要长。

    #include<stdio.h>
    
    int main(void){
        int m,t,s;
        int r_apple,e_apple;
        scanf("%d %d %d",&m,&t,&s);
        if(m==0||m*t<s){
            printf("0");
            return 0;
        }
        if(s==0){
            printf("%d",m);
        }else{
            if(t==0){
                printf("0");
            }else{
                e_apple=s/t;
                if(e_apple*t<s){
                    e_apple+=1;
                }
                r_apple=m-e_apple;
                printf("%d",r_apple);
            }
        }
    }
    

    P2181对角线

    这题说任意三条对角线都不会交于一点,所以过一个交点的就只有两条对角线,而两条对角线已经确定了四个点,就相当于这道题是排列组合题,从n个点中选出四个点。还有一个问题是这题的n取值非常大,必须由unsigned long long来定义变量。

    #include<stdio.h>
    
    int main(void){
        unsigned long long n;
        unsigned long long dot;
        scanf("%llu",&n);
        if(n<=3){
            printf("0");
        }else{
            dot=n*(n-1)/2*(n-2)/3*(n-3)/4;
            printf("%llu
    ",dot);
        }
        return 0;
    }
    

    P5710 数的性质

    分情况讨论即可

    #include<stdio.h>
    
    int main(void){
        int num;
        scanf("%d",&num);
        if(num%2==0&&num>4&&num<=12){
            printf("1 ");
        }else{
            printf("0 ");
        }
    
        if(num%2==0||(num>4&&num<=12)){
            printf("1 ");
        }else{
            printf("0 ");
        }
    
        if(num%2==0&&(num<=4||num>12)){
            printf("1 ");
        }else if(num%2!=0&&(num>4&&num<=12)){
            printf("1 ");
        }else{
            printf("0 ");
        }
    
        if(num%2!=0&&(num<=4||num>12)){
            printf("1");
        }else{
            printf("0");
        }
    }
    

    P5711 闰年判断

    普通闰年:年份能被4整除,但是不能被100整除。
    世纪闰年:年份能被400整除。

    #include<stdio.h>
    
    int main(void){
        int year;
        scanf("%d",&year);
        if((year%4==0&&year%100!=0)||year%400==0){
            printf("1");
        }else{
            printf("0");
        }
    }
    

    P5712 Apples

    分情况讨论即可

    #include<stdio.h>
    
    int main(void){
        int x;
        scanf("%d",&x);
        if(x==0){
            printf("Today, I ate 0 apple.");
        }else if(x==1){
            printf("Today, I ate 1 apple.");
        }else{
            printf("Today, I ate %d apples.",x);
        }   
    }
    

    P5713 洛谷团队系统

    分情况讨论

    #include<stdio.h>
    
    int main(void){
        int n;
        int LocalTime,LuoguTime;
        scanf("%d",&n);
        LocalTime=n*5;
        LuoguTime=11+n*3;
        if(LocalTime<LuoguTime){
            printf("Local");
        }else{
            printf("Luogu");
        }
        
    }
    

    P5714 肥胖问题

    这道题用c++会方便很多

    #include<iostream>
    using namespace std;
    
    int main(void){
        float m,h;
        float BMI;
        cin>>m>>h;
        BMI=m/h*h;
        if(BMI<18.5){
            cout<<"Underweight";
        }else if(BMI<24&&BMI>=18.5){
            cout<<"Normal";
        }else{
            cout<<BMI<<endl;
            cout<<"Overweight";
        }
        
    }
    

    P5715 三位数排序

    我用的是冒泡排序:

    #include<stdio.h>
    
    int main(void){
        int num[3];
        int temp,i,j;
        for(i=0;i<3;i++){
            scanf("%d",&num[i]);
        }
        
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        }
        printf("%d %d %d",num[0],num[1],num[2]);
    }
    

    P5716 月份天数

    分类讨论

    #include<stdio.h>
    
    int main(void){
        int year,month;
        scanf("%d %d",&year,&month);
        if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
            printf("31");
        }else if(month==4||month==6||month==9||month==11){
            printf("30");
        }else{
            if((year%4==0&&year%100!=0)||year%400==0){
                printf("29");
            }else{
                printf("28");
            }
        }
        
    }
    

    P1888 三角函数

    我这里先使用了冒泡排序,再使用了辗转相除法。

    #include<stdio.h>
    
    int main(void){
        unsigned long long num[3],temp;
        int i,j,n=1,a,b;
        scanf("%llu %llu %llu",&num[0],&num[1],&num[2]);
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        } 
    
        b=num[2];
        a=num[0];
        while (n){
            n=b%a;
            b=a;
            a=n;
        }
        printf("%llu/%llu",num[0]/b,num[2]/b);
    }
    

    P5717 三角形分类

    分情况讨论

    #include<stdio.h>
    
    int main(void){
        int num[3];
        int i,j,temp;
        scanf("%d %d %d",&num[0],&num[1],&num[2]);
    
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        }
    
        if(num[0]+num[1]<=num[2]){
            printf("Not triangle");
            return 0;
        }
        if(num[0]*num[0]+num[1]*num[1]==num[2]*num[2]){
            printf("Right triangle
    ");
        }
        if(num[0]*num[0]+num[1]*num[1]>num[2]*num[2]){
            printf("Acute triangle
    ");
        }
        if(num[0]*num[0]+num[1]*num[1]<num[2]*num[2]){
            printf("Obtuse triangle
    ");
        }
        if(num[0]==num[1]||num[1]==num[2]){
            printf("Isosceles triangle
    ");
        }
        if(num[0]==num[1]&&num[1]==num[2]){
            printf("Equilateral triangle");
        }
        
    }
    

    P1909 买铅笔

    分类讨论不同铅笔数目的总价格

    #include<stdio.h>
    
    int main(void){
        int n,i,min;
        int amount[4],price[4],money[4];
        scanf("%d",&n);
        for(i=0;i<3;i++){
            scanf("%d %d",&amount[i],&price[i]);
            if(n%amount[i]==0){
                money[i]=n/amount[i]*price[i];
            }else{
                money[i]=(n/amount[i]+1)*price[i];
            }
        }
        min=money[0];
        for(i=0;i<3;i++){
            if(min>money[i]){
                min=money[i];
            }
        }
        printf("%d",min);
    }
    

    P4414 ABC

    判断ABC的顺序

    #include<stdio.h>
    
    int main(void){
        int num[4],i,j,temp;
        char str[4];
        for(i=0;i<3;i++){
            scanf("%d",&num[i]);
        }
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        }
        scanf("%s",str);
        for(i=0;i<3;i++){
            if(str[i]=='A') printf("%d ",num[0]);
            if(str[i]=='B') printf("%d ",num[1]);
            if(str[i]=='C') printf("%d ",num[2]);
        }
    }
    

    P5718 找最小值

    定义一个最小值min,然后与每次输入的值进行比较,找出最小值。

    #include<stdio.h>
    
    int main(void){
        int n,a,min=1000;
        scanf("%d",&n);
        while (n--){
            scanf("%d",&a);
            if(a<min){
                min=a;
            }
        }
        printf("%d",min);
    }
    

    P5719 分类平均

    循环一下就行

    #include<stdio.h>
    
    int main(void){
        int i;
        int n,k,count=0;
        double sum1=0,sum2=0;
        scanf("%d %d",&n,&k);
        for(i=1;i<=n;i++){
            if(i%k==0){
                sum1+=i;
                count+=1;
            }else{
                sum2+=i;
            }
        }
        printf("%.1lf %.1lf",sum1/count,sum2/(n-count));
    }
    

    P5720 一尺之棰

    循环直到1

    #include<stdio.h>
    
    int main(void){
        int a,day=1;
        scanf("%d",&a);
        while (a!=1){
            day++;
            a=a/2;
        }
        printf("%d",day);
    }
    

    P5721 数字直角三角形

    两层循环解决

    #include<stdio.h>
    
    int main(void){
        int n,j,i,num=1;
        int floor;
        scanf("%d",&n);
        floor=n;
        for(j=floor;j>0;j--){
            for(i=0;i<floor;i++){
                if(num<10){
                    printf("0%d",num++);
                }else{
                    printf("%d",num++);
                }
            }
            floor--;
            printf("
    ");
        }
    }
    

    P1009 阶乘之和

    这个涉及到了高精算法

    #include<stdio.h> 
    #include<string.h> 
    int src[1001],v[1001],src_l=1,v_l=1;
    void add(){
        int i=0,x=0;
        while(i<=src_l||i<=v_l){
            i++;
            src[i]+=x+v[i];
            x=src[i]/10;
            src[i]%=10;
        }
        if(x)src[++i]=x;
        if(i>src_l)src_l=i;
    }
    void mut(int arg){
        int i=1,x=0;
        while(i<=v_l){
            v[i]=v[i]*arg+x;
            x=v[i]/10;
            v[i]%=10;
            i++;
        }
        while(x){
            v[++v_l]=x%10;
            x/=10;
        }
    }
    int main(){
        int i,n;
        scanf("%d",&n);
        memset(src,0,sizeof(src));
        memset(v,0,sizeof(v));
        src[1]=v[1]=1;
        for(i=2;i<=n;i++){
            mut(i);
            add();
        }
        while(src[src_l]==0)src_l--;
        for(i=src_l;i>=1;i--)
           printf("%d",src[i]);
        return 0;
    }
    

    P5722 数列求和

    #include<stdio.h>
    
    int main(void){
        int n,sum=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            sum+=i;
        }
        printf("%d",sum);
    }
    

    P5721 质数口袋

    写个子函数判断是否为质数

    #include<stdio.h>
    int prime(int n);
    
    int main(void){
        int L,i,sum=0,count=0;
        scanf("%d",&L);
        for(i=2;;i++){
            if(prime(i)){
                if(sum+i>L){
                    break;
                }
                sum+=i;
                count++;
                printf("%d
    ",i);
            }
        }
        printf("%d",count);
    }
    
    int prime(int n){
        int i;
        for(i=2;i*i<=n;i++){
            if(n%i==0){
               return 0;
            }
        }
        return 1;
    }
    

    P2669 金币

    挺简单的

    #include<stdio.h>
    
    int main(void){
        int k,i,days=0,sum=0;
        scanf("%d",&k);
        for(i=1;;i++){
            if (days+i>k){
                sum+=(k-days)*i;
                break;
            }
            sum+=i*i;
            days+=i;
        }
        printf("%d",sum);
    }
    

    P1217 回文质数

    通过埃文斯筛选法+回文数判断

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    int IsPrime(int x);
    int IsPlaindrome(int x);
    int prime[10000001];
    
    int main(void){
        int a,b,len;
        scanf("%d %d",&a,&b);
        if(b>10000000) b=9999999;
        IsPrime(b);
        if(a%2==0) a++;
        for(int i=a;i<=b;i+=2){
            if(prime[i]&&IsPlaindrome(i)){
                printf("%d
    ",i);
            }
        }
    }
    
    int IsPrime(int x){
        int n;
        memset(prime,1,sizeof(prime));
        prime[1]=0;
        n=sqrt(x);
        for(int i=2;i<=n;i++){
            if(prime[i]){
                for(int j=2;j*i<=x;j++){
                    prime[i*j]=0;
                }
            }
        }
    }
    
    int IsPlaindrome(int x){
        int temp=x,ans=0;
        while(temp){
            ans=temp%10+ans*10;
            temp=temp/10;
        }
        if(ans==x) return 1;
        else return 0;
    }
    

    数字反转

    判断两种情况,一种是负数,另一种是尾部由多个0的情况。

    #include<stdio.h>
    #include<string.h>
    
    int main(void){
        char N[11];
        int len,i,flag=0;
        scanf("%s",N);
        if(N[0]!='-'){
            len=strlen(N);
            for(i=len-1;i>=0;i--){
                if(N[i]!='0'||flag!=0){
                    printf("%c",N[i]);
                    flag=1;
                }
            }
        }else{
            len=strlen(N);
            printf("-");
            for(i=len-1;i>=1;i--){
                if(N[i]!='0'||flag!=0){
                    printf("%c",N[i]);
                    flag=1;
                }
            }
        }
        
    
    }
    

    P1720 月落乌啼算钱

    找到规律即可

    #include<stdio.h>
    
    int main(void){
        int n,i;
        double ans[50];
        scanf("%d",&n);
        ans[1]=ans[2]=1.00;
        for(i=3;i<=n;i++){
            ans[i]=ans[i-1]+ans[i-2];
        }
        printf("%.2lf",ans[n]);
    }   
    

    P5724 求极差

    找出最大最小值

    #include<stdio.h>
    
    int main(void){
        int i,n,a[101],min=1000,max=0;
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(min>a[i]){
                min=a[i];
            }
            if(max<a[i]){
                max=a[i];
            }
        }
        printf("%d",max-min);
    }   
    

    P1420 最长连号

    一开始理解错了题目意思,害。找出连续数的长度,然后赋值给max,再找下一个连续数的长度,比较长度大小。

    #include<stdio.h>
    
    int main(void){
        int n,i,len=1,max=0;
        int num[10001];
        scanf("%d",&n);
        scanf("%d",&num[0]);
        for(i=1;i<n;i++){
            scanf("%d",&num[i]);
            if(num[i]>num[i-1]&&num[i]-num[i-1]==1){
                len++;
            }else{
                if(max<len){
                    max=len;
                }
                len=1;
            }
        }
        printf("%d",max);
    }   
    

    P1075 质因数分解

    找出一个质数,能不能整除n,如果能得到的商是否是质数。

    #include<stdio.h>
    int IsPrime(int x);
    
    int main(void){
        int n,i,j,ans;
        scanf("%d",&n);
        for(i=2;i*i<=n;i++){
            if(!IsPrime(i)) continue;
            if(n%i==0){
                ans=n/i;
                if(IsPrime(ans)){
                    printf("%d",ans);
                }
                
            }
        }
    }   
    
    int IsPrime(int x){
        int i;
        if(x==2||x==3) return 1;
        for(i=2;i*i<=x;i++){
            if(x%i==0){
                return 0;
            }
        }
        return 1;
    }
    

    P5725 求三角形

    简单题

    #include<stdio.h>
    
    int main(void){
        int n,i,j,k=1;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(k<10){
                    printf("0%d",k++);
                }else{
                    printf("%d",k++);
                }
            }
            printf("
    ");
        }
    
        k=1;
        printf("
    ");
    
        for(i=1;i<=n;i++){
            for(int l=1;l<=n-i;l++){
                printf("  ");
            }
            for(j=1;j<=i;j++){
                if(k<10){
                    printf("0%d",k++);
                }else{
                    printf("%d",k++);
                }
            }
            printf("
    ");
        }
        
    }   
    

    P5726 打分

    找出最大最小值减去后取平均值

    #include<stdio.h>
    
    int main(void){
        int n,i,min=10,max=0;
        int score[1001];
        double ans=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            scanf("%d",&score[i]);
            if(score[i]>max){
                max=score[i];
            }
            if(score[i]<min){
                min=score[i];
            }
            ans+=score[i];
        }
        printf("%.2lf",(ans-min-max)/(n-2));
    }   
    

    P4956 Davor

    我做的很复杂,看了一下别人貌似比较简单。我这里主要是先判断能否被52整除,然后进行枚举x和k。如果不能,再进行三重循环进行判断。

    #include<stdio.h>
    
    int main(void){
        int n,i,j,k,week;
        scanf("%d",&n);
        if(n%52==0){
            week=n/52;
            for(i=1;;i++){
                for(j=1;j<=100;j++){
                    if(j*7+i*21==week){
                        printf("%d
    %d",j,i);
                        return 0;
                    }
                }
            }
        }
    
        week=n/51;
        for(i=1;;i++){
            for(j=1;j<=100;j++){
                for(k=1;k<=6;k++){
                    if((j*7+i*21)*51+j*k+(k*k-k)/2==n){
                        printf("%d
    %d",j,i);
                    }
                }
            }
        }
    
    }   
    
  • 相关阅读:
    poj 1700 Crossing River 过河问题。贪心
    Alice's Print Service
    POI 2000 ------Stripes
    Uva 1378
    hdu 3068 最长回文
    bnu Game 博弈。
    链栈的C语言实现
    链栈的C语言实现
    顺序栈C语言实现
    顺序栈C语言实现
  • 原文地址:https://www.cnblogs.com/zesiar0/p/13339986.html
Copyright © 2020-2023  润新知