洛谷学习

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\n",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\n");
    }
    if(num[0]*num[0]+num[1]*num[1]>num[2]*num[2]){
        printf("Acute triangle\n");
    }
    if(num[0]*num[0]+num[1]*num[1]<num[2]*num[2]){
        printf("Obtuse triangle\n");
    }
    if(num[0]==num[1]||num[1]==num[2]){
        printf("Isosceles triangle\n");
    }
    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("\n");
    }
}

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\n",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\n",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("\n");
    }

    k=1;
    printf("\n");

    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("\n");
    }
    
}   

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\n%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\n%d",j,i);
                }
            }
        }
    }

}   
posted @ 2020-07-19 15:52  zesiar0  阅读(232)  评论(0编辑  收藏  举报