算法学习-洛谷基础题-顺序

洛谷基础题

P5706 【深基2.例8】再分肥宅水

一次性输入多个数:

a,b=map(float,input().split())

可以使用列表代替a,b可以使用不同的类型代替float。

python格式化输出

整数

%o —— oct 八进制
%d —— dec 十进制
%x —— hex 十六进制

浮点数

%f ——保留小数点后面六位有效数字
  %.3f,保留3位小数位
%e ——保留小数点后面六位有效数字,指数形式输出
  %.3e,保留3位小数位,使用科学计数法
%g ——在保证六位有效数字的前提下,使用小数方式,否则使用科学计数法
  %.3g,保留3位有效数字,使用小数或科学计数法

round(number[, ndigits])
    参数:
    number - 这是一个数字表达式。
    ndigits - 表示从小数点到最后四舍五入的位数。默认值为0。
    返回值
    该方法返回x的小数点舍入为n位数后的值。

字符

%s
%10s——右对齐,占位符10位
%-10s——左对齐,占位符10位
%.2s——截取2位字符串
%10.2s——10位占位符,截取两位字符串

format

(1)不带编号,即“{}”
(2)带数字编号,可调换顺序,即“{1}”、“{2}”
(3)带关键字,即“{a}”、“{tom}”

'b' - 二进制。将数字以2为基数进行输出。
'c' - 字符。在打印之前将整数转换成对应的Unicode字符串。
'd' - 十进制整数。将数字以10为基数进行输出。
'o' - 八进制。将数字以8为基数进行输出。
'x' - 十六进制。将数字以16为基数进行输出,9以上的位数用小写字母。
'e' - 幂符号。用科学计数法打印数字。用'e'表示幂。
'g' - 一般格式。将数值以fixed-point格式输出。当数值特别大的时候,用幂形式打印。
'n' - 数字。当值为整数时和'd'相同,值为浮点数时和'g'相同。不同的是它会根据区域设置插入数字分隔符。
'%' - 百分数。将数值乘以100然后以fixed-point('f')格式打印,值后面会有一个百分号。

< (默认)左对齐、> 右对齐、^ 中间对齐、= (只用于数字)在小数点后进行补齐
取位数“{:4s}”、"{:.2f}"等
百分数显示{:.2%}

>>> print('{} {}'.format('hello','world'))  # 不带字段
hello world
>>> print('{0} {1}'.format('hello','world'))  # 带数字编号
hello world
>>> print('{0} {1} {0}'.format('hello','world'))  # 打乱顺序
hello world hello
>>> print('{1} {1} {0}'.format('hello','world'))
world world hello
>>> print('{a} {tom} {a}'.format(tom='hello',a='world'))  # 带关键字
world hello world


>>> print('{0:b}'.format(3))
11
>>> print('{:c}'.format(20))

>>> print('{:d}'.format(20))
20
>>> print('{:o}'.format(20))
24
>>> print('{:x}'.format(20))
14
>>> print('{:e}'.format(20))
2.000000e+01
>>> print('{:g}'.format(20.1))
20.1
>>> print('{:f}'.format(20))
20.000000
>>> print('{:n}'.format(20))
20
>>> print('{:%}'.format(20))
2000.000000%
>>>

#时间表示
>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'

##钱进制表示
>>> '{:,}'.format(1234567890)
'1,234,567,890'

三角形面积

#include <stdio.h>
#include <math.h>

double cacu(double a,double b,double c){
    double p=0;
    p=0.5*(a+b+c);
    return (sqrt(p*(p-a)*(p-b)*(p-c)));
}
int main(void){
    double a=0,b=0,c=0,S=0;
    scanf("%lf %lf %lf",&a,&b,&c);
    S=cacu(a,b,c);
    printf("%.1lf",S);
    return 0;
}

对角线

思路很简单,

首先不会有三条对角线交与一点,所以过某交点只能有两条对角线;

其次,两条对角线其实确定了四个点(可以这么理解)

四个顶点构成一个四边形

所以每个顶点由一个四边形造成

因此我们只需要计算出该四边形有多少个即可,即: A n 4 A_n^4 An4

#一开始思路
#include <stdio.h>
int C1(int n,int a){
    if (a==n-4)  return 1;
    return(a*C1(n,a-1));
}
int main(void){
    int a=0,b=0;
    scanf("%d",&a);
    if (a>4){
        int n=a;
        b=C1(n,a)/24;
        printf("%d",b);
    }
    else if(a==4){
        printf("1");
    }
    else{
        printf("0");
    }
    return 0;
}

这个程序虽然可以手动测试成功但是上传到服务器会出现问题,问题在于其数据范围超出了。

#include <stdio.h>
int main(void){
    unsigned long long  a=0,b=0;
    scanf("%lld",&a);
    # b=a*(a-1)*(a-2)*(a-3)/24;
    b=a*(a-1)/2*(a-2)/3*(a-3)/4;
    printf("%lld",b);
    return 0;
}

这个地方存在一个小技巧 b=a*(a-1)*(a-2)*(a-3)/24;改成 b=a*(a-1)/2*(a-2)/3*(a-3)/4;

数的性质

一些数字可能拥有以下的性质:

  • 性质 1:是偶数;
  • 性质 2:大于 4 且不大于 12。

小A 喜欢这两个性质同时成立的数字;Uim 喜欢这至少符合其中一种性质的数字;八尾勇喜欢刚好有符合其中一个性质的数字;正妹喜欢不符合这两个性质的数字。

#include <stdio.h>
#include <math.h>

int judge(int num){
    if(num%2==0){
        if(num>4&&num<=12){
            return 4; //A,U
        }
        return 3;  //U.8
    }
    else if(num>4&&num<=12){
        return 3; //U.8
    }
    return 2; //zheng
}
int main(void){
    int a=0,choice;
    scanf("%d",&a);
    choice=judge(a);
    switch (choice) {
        case 4:printf("1 1 0 0"); break;
        case 3:printf("0 1 1 0"); break;
        default:
            printf("0 0 0 1");
    }
    return 0;
}

闰年判断

输入一个年份(大于 1582 的整数 ),判断这一年是否是闰年,如果是输出 1,否则输出 0。

#include <stdio.h>
#include <math.h>

int judge(int num){
    if(num%4==0){
        if(num%400==0)
            return 1;
        else if(num%100==0)
            return 0;
        return 1;
    }
return 0;
}
int main(void){
    int a=0,choice;
    scanf("%d",&a);
    choice=judge(a);
    printf("%d",choice);
    return 0;
}

Apples

#include <stdio.h>
#include <math.h>

int judge(int num){
    if(num==0){
            return 0;
    }
    else if(num==1)
        return 1;
    return 2;
}
int main(void){
    int a=0,choice;
    scanf("%d",&a);
    if(a==0){
        printf("Today, I ate 0 apple.");
        return 0;
    }
    else if(a==1){
        printf("Today, I ate 1 apple.");
    }
    else{
        printf("Today, I ate %d apples.",a);
    }
    return 0;
}

洛谷团队系统

如果在自己的电脑上配置题目和测试数据,每题需要花费时间 5 分钟;而在洛谷团队中上传私有题目,每题只需要花费 3 分钟,但是上传题目之前还需要一次性花费 11 分钟创建与配置团队。现在要配置 n(n<=100)n(n≤100) 道题目,如果本地配置花费的总时间短,请输出 Local,否则输出 Luogu

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

肥胖问题

#include <stdio.h>

int main(void){
    double m,h,BMI;
    scanf("%lf %lf",&m,&h);
    BMI=m/(h*h);
    if (BMI<18.5){
        printf("Underweight");
    }
    else if (BMI>=18.5&&BMI<24){
        printf("Normal");
    }
    else{
        printf("%.6g\n",BMI);
        printf("Overweight");
    }
    return 0;
}

三位数排序

给出三个整数 a,b,c(0<=a,b,c<=100)a,b,c(0≤a,b,c≤100),要求把这三位整数从小到大排序。

#include <stdio.h>


int main(void){
    int m,h,n;
    scanf("%d %d %d",&m,&h,&n);
    if (m>=h&&m>=n&&h>=n){
        printf("%d %d %d",n,h,m);
    }
    else if (m>=h&&m>=n&&n>=h){
        printf("%d %d %d",h,n,m);
    }
    else if (h>=m&&m>=n&&h>=n){
        printf("%d %d %d",n,m,h);
    }
    else if (n>=m&&m>h&&n>=h){
        printf("%d %d %d",h,m,n);
    }
    else if (h>=m&&n>m&&n>=h){
        printf("%d %d %d",m,h,n);
    }
    else{
        printf("%d %d %d",m,n,h);
    }
    return 0;
}

月份天数

输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年

#include <stdio.h>
int judge(int a){
    if(a==1||a==3||a==5||a==7||a==8||a==10||a==12)
        printf("31");
    else
        printf("30");
}
int judge_run(int num){
    if(num%4==0){
        if(num%400==0)
            return 1;
        else if(num%100==0)
            return 0;
        return 1;
    }
    return 0;
}
int main(void){
    int year,month,day;
    scanf("%d %d",&year,&month);
    if(month==2){
        if(judge_run(year)) {
            printf("29");
            return 0;
        }
        else printf("28");
        return 0;
    }
    judge(month);
    return 0;
}

ISBN号码

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符-之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以11加上次位数字乘以22……以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母XX。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9再求和,即0×1+6×2+……+2×9=158然后取158mod11的结果4作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。

字符串转数字

需要库函数#include<stdlib.h>

● atof():将字符串转换为双精度浮点型值。
● atoi():将字符串转换为整型值。
● atol():将字符串转换为长整型值。
● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。
● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。
● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。

数字转字符串

● itoa():将整型值转换为字符串。
● ltoa():将长整型值转换为字符串。
●ultoa():将无符号长整型值转换为字符串。
● gcvt():将浮点型数转换为字符串,取四舍五入。
● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。
● fcvt():指定位数为转换精度,其余同ecvt()。

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

int main(void){
    char s[100];
    int num[100];
    int all=0;
    int len;
    scanf("%s",s);
    len=strlen(s);
    for(int i=0;i<len;i++){
        if(s[i]=='-')
            for(int j=0;j<len-i;j++){
                s[i+j]=s[i+j+1];
            }

    }
    len=strlen(s);
    for(int i=0;i<len;i++){
        if(s[i]=='X') {
            num[i]=10;
            continue;
        }
        char m=s[i];
        num[i]=atoi(&m);
//printf("@%d",num[i]);
    }
    for(int i=0;i<len-1;i++){
        all+=(i+1)*num[i];

    }
    //printf("%d",all);
    if(all%11==num[len-1])
        printf("Right");
    else {
        for (int i = 0; i < len - 1; i++) {
            printf("%d", num[i]);
            if (i == 0 || i == 3 || i == 8) {
                printf("-");
            }
        }
        if (all % 11 == 10) {
            printf("X");
        } else
            {
            printf("%d", all % 11);
        }
    }
    return 0;
}

小鱼的航程

#include <stdio.h>
int main()
{
  long int a1,b1,c;
  int a2,b2;
  scanf("%d",&a2);
  scanf("%ld",&a1);
  b1=a1/7;
  b2=a1%7;
  c=b1*250*5;
  if((b2+a2)==6)
  {
  	c=c+(b2-1)*250;
  	printf("%ld",c+250);
  }
  else if((b2+a2)>6)
  {
  	c=c+(b2-2)*250;
  	printf("%ld",c+250);
  }
  else if(b1==0&&(((b2-1)+a2)>=6)&&((b2-1)+a2)<=7)
  {printf("%ld",c+250);}
  else{
  	c=c+(b2)*250;
  	printf("%ld",c);
  }
  return 0;
}

三角函数

偷懒做法,改动三位数排序

三角形分类

#include <stdio.h>
#include <math.h>
int a,b,c,a1,b1,c1;
void paixu(){
    if(a>=b&&a>=c){  //a is max
    a1=a;
    if(b>=c) {
    b1=b;
    c1=c;
    } else{
        b1=c;
        c1=b;}
    }
    if(b>=a&&b>=c){  //a is max
        a1=b;
        if(a>=c) {
            b1=a;
            c1=c;
        } else{
            b1=c;
            c1=a;}

    }
    if(c>=b&&c>=a){  //a is max
        a1=c;
        if(b>=a) {
            b1=b;
            c1=a;
        } else{
            b1=a;
            c1=b;}

    }
}
int main(void){

    scanf("%d %d %d",&a,&b,&c);

    paixu(a,b,c,a1,b1,c1);

    if(c1+b1<a1||c1==0){
        printf("Not triangle");
    }
    else{
        if((c1*c1+b1*b1)==a1*a1){
            printf("Right triangle\n");
        } else if((c1*c1+b1*b1)<a1*a1){
            printf("Obtuse triangle\n");
        }else{
            printf("Acute triangle\n");
        }
        if(c1==b1||b1==a1){
            printf("Isosceles triangle\n");
        }
        if(c1==b1&&b1==a1){
            printf("Equilateral triangle\n");
        }
    }
    return 0;
}

ABC

#include <stdio.h>
#include <math.h>
int a,b,c,a1,b1,c1;
void paixu(){
    if(a>=b&&a>=c){  //a is max
    a1=a;
    if(b>=c) {
    b1=b;
    c1=c;
    } else{
        b1=c;
        c1=b;}
    }
    if(b>=a&&b>=c){  //a is max
        a1=b;
        if(a>=c) {
            b1=a;
            c1=c;
        } else{
            b1=c;
            c1=a;}

    }
    if(c>=b&&c>=a){  //a is max
        a1=c;
        if(b>=a) {
            b1=b;
            c1=a;
        } else{
            b1=a;
            c1=b;}

    }
}
int main(void){
char n,m,l;
    scanf("%d %d %d ",&a,&b,&c);
    scanf("%c%c%c",&m,&n,&l);
    paixu();
   // printf("%c-%c-%c-",m,n,l);
    //printf("%d %d %d",a1,b1,c1);
    if(m=='A'){
        printf("%d ",c1);
    } else if(m=='B'){
        printf("%d ",b1);
    } else{
        printf("%d ",a1);
    }

    if(n=='A'){
        printf("%d ",c1);
    } else if(n=='B'){
        printf("%d ",b1);
    } else{
        printf("%d ",a1);
    }

    if(l=='A'){
        printf("%d ",c1);
    } else if(l=='B'){
        printf("%d ",b1);
    } else{
        printf("%d ",a1);
    }
    return 0;
}

回文质数

改了半天最后三个数据超时,只能开挂了QAQ,可以打表AC。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/7/23 9:49
# @Author  : F4sthand
# @File    : temp.py
import math
def sushu(a):
    b=int(math.sqrt(a+1))
    for i in range(2,b+1):
        if(a%i==0):
            return 0
    return 1
def string_reverse(str):
    return str[::-1]
def huiwen(a):
    a1=str(a)
    a2=string_reverse(a1)
    if(a1==a2):
        return 1
    return 0
def guolv(a):
    if((a%2==0)or(a%3==0)):
        return 0
    else:
        return 1
if __name__ == '__main__':
    a, b = map(int,input().split())
    if((a%2==0)):
        for i in range(a+1,b,2):
            if(guolv(i)):
                if(huiwen(i)):
                    if(sushu(i)):
                        print(i)
    else:
        for i in range(a,b):
            if(guolv(i)):
                if(huiwen(i)):
                    if(sushu(i)):
                        print(i)

数字反转

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/7/23 9:49
# @Author  : F4sthand
# @File    : temp.py

def string_reverse(str):
    return str[::-1]

if __name__ == '__main__':
    a=input()
    if(str(a)[0]!='-'):
        b=string_reverse(str(a))
        print("%d" % int(b))
    else:
        b=string_reverse(str(a)[1:])
        print("-%d"%int(b))

求极差

#include <stdio.h>

int main(void){
    int max=0,min= 10000,num,temp;
    scanf("%d",&num);
    for(int i=0;i<num;i++){
        scanf("%d",&temp);
        if(temp>max) max=temp;
        if(temp<min) min=temp;

    }
    printf("%d",max-min);
    return 0;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值