洛谷学习
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);
}
}
}
}
}