洛谷学习 P5708 三角形面积 P5709 Apples Prologue P2181对角线 P5710 数的性质 P5711 闰年判断 P5712 Apples P5713 洛谷团队系统 P5714 肥胖问题 P5715 三位数排序 P5716 月份天数 P1888 三角函数 P5717 三角形分类 P1909 买铅笔 P4414 ABC P5718 找最小值 P5719 分类平均 P5720 一尺之棰 P5721 数字直角三角形 P1009 阶乘之和 P5722 数列求和 P5721 质数口袋 P2669 金币 P1217 回文质数 数字反转 P1720 月落乌啼算钱 P5724 求极差 P1420 最长连号 P1075 质因数分解 P5725 求三角形 P5726 打分 P4956 Davor

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

洛谷学习
P5708 三角形面积
P5709 Apples Prologue
P2181对角线
P5710 数的性质
P5711 闰年判断
P5712 Apples
P5713 洛谷团队系统
P5714 肥胖问题
P5715 三位数排序
P5716 月份天数
P1888 三角函数
P5717 三角形分类
P1909 买铅笔
P4414 ABC
P5718 找最小值
P5719 分类平均
P5720 一尺之棰
P5721 数字直角三角形
P1009 阶乘之和
P5722 数列求和
P5721 质数口袋
P2669 金币
P1217 回文质数
数字反转
P1720 月落乌啼算钱
P5724 求极差
P1420 最长连号
P1075 质因数分解
P5725 求三角形
P5726 打分
P4956 Davor

可以看到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);
                }
            }
        }
    }

}