CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
凑十个题
main()函数不写 return 默认返回 0。下同。
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d",a+b);
}
求一元二次方程的根
养成好习惯,浮点数进行比较的时候作差取绝对值。
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
for(double a,b,c,d,r,i; n--;)
{
scanf("%lf%lf%lf",&a,&b,&c);
d=b*b-4*a*c;
if(fabs(d)<1e-9)
printf("x1=x2=%.5f\n",
-b/a/2);
else if(d>0)
printf("x1=%.5f;x2=%.5f\n",
(-b+sqrt(d))/2/a,
(-b-sqrt(d))/2/a);
else
{
r=(0-b)/2/a;//直接写-b会导致实部打印负零
i=sqrt(-d)/2/a;
printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi\n",
r,i,r,i);
}
}
}
平衡饮食
通过预处理降低代码量。
#include<stdio.h>
double cont[10][3]=
{
7.5,0.75,78,
10,1.25,75,
1.5,0.19,4.28,
35,18,42,
500,500,60,//一百颗蛋
16.5,28.8,1.05,
17.7,20.33,4.06,
14.9,0.8,0.93,
0,100,0,
0.85,0.5,8
},all,sum[3]= {0,0,0},scal[3]= {4.1,9.3,4.1};
int main()
{
for(int i=0,tmp; i!=10; ++i)
{
scanf("%d",&tmp);
for(int j=0; j!=3; ++j)
sum[j]+=tmp*scal[j]*cont[i][j];
}
all=sum[0]+sum[1]+sum[2];
for(int i=0; i!=3; ++i)
sum[i]/=all;
printf(sum[0]>0.14&&sum[0]<0.16&&
sum[1]>0.3&&sum[1]<0.35&&
sum[2]>0.49&&sum[2]<0.56?
"yes":"no");
}
求出 e 的值
#include<stdio.h>
int main()
{
int n;
double s=1,w=1;
scanf("%d",&n);
for(int i=1; i<=n; ++i)
s+=1/(w*=i);
printf("%.10lf",s);
}
数制转换
偷个懒,直接用 stdlib.h
库里的 strtol 函数。
n 为 0 的情况不要漏掉了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
long a,b,n=0;
char s[32];
scanf("%d%s%d",&a,s,&b);
n=strtol(s,NULL,a);
if(n==0)
{
printf("0");
return 0;
}
for(a=0; n; n/=b)
s[a++]=(n%b>9?n%b+'A'-10:n%b+'0');
while(a)
printf("%c",s[--a]);
}
合唱队形
为了方便,给每名队员重新编号,新编号从 0 开始。
记 f[0][i]
为第 i 名队员左边最多可站的人数,那么有这样的转移关系: f[0][i]=max{0,f[0][j]+1}
,其中 j 是满足 0<=j<i&&t[i]>t[j]
的所有数;同理,记 f[1][i]
为第 i 名队员右边最多可站的人数,那么有这样的转移关系: f[1][i]=max{0,f[1][j]+1}
,其中 j 是满足 i<j<n&&t[i]>t[j]
的所有数;其中,式中的 1 是第 j 名同学自身。
于是,结果是 n-max{f[0][i]+f[1][i]}-1
,式中 1 是第 i 名队员本身。
#include<stdio.h>
int n,tmp=0,t[128]= {0},f[2][128]= {0};
//全局数组声明的时候如果没有给初值则初始化为0
int main()
{
scanf("%d",&n);
for(int i=0; i!=n; ++i)
{
scanf("%d",&t[i]);
for(int j=0; j!=i; ++j)
if(t[i]>t[j]&&f[0][i]<f[0][j]+1)
f[0][i]=f[0][j]+1;
}
for(int i=n-1; i!=-1; --i)
{
for(int j=i; j!=n; ++j)
if(t[i]>t[j]&&f[1][i]<f[1][j]+1)
f[1][i]=f[1][j]+1;
if(tmp<f[0][i]+f[1][i])
tmp=f[0][i]+f[1][i];
}
printf("%d",n-tmp-1);
}
细菌繁殖
直接按日模拟。
#include<stdio.h>
long n,days[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
scanf("%d",&n);
for(long m1,m2,d1,d2,z; n--;)
{
scanf("%d%d%d%d%d",&m1,&d1,&z,&m2,&d2);
for(; m1!=m2||d1!=d2; ++d1,z*=2)
if(d1==days[m1])
{
++m1;
d1=0;
}
printf("%d\n",z);
}
}
肿瘤面积
#include<stdio.h>
int main()
{
int n,x[2]= {0,1024},y[2]= {0,1024};
scanf("%d",&n);
for(int i=0,tmp; i!=n; ++i)
for(int j=0; j!=n; ++j)
{
scanf("%d",&tmp);
if(!tmp)
{
if(x[0]<i)x[0]=i;
if(x[1]>i)x[1]=i;
if(y[0]<j)y[0]=j;
if(y[1]>j)y[1]=j;
}
}
printf("%d",(x[0]-x[1]-1)*(y[0]-y[1]-1));
}
求平均年龄
#include<stdio.h>
int main()
{
int n;
double s=0;
scanf("%d",&n);
for(int i=0,t; i!=n; ++i)
{
scanf("%d",&t);
s+=t;
}
printf("%.2lf",s/n);
}
谁拿了最多奖学金
用 scanf 输入时要占位符加空格。 比 cin 不晓得高到哪里去了?!
#include<stdio.h>
#include<string.h>
int main()
{
int n,sum=0,ans_money=0;
char gb,xb,name[32],ans_name[32];
scanf("%d",&n);
for(int money,qm,py,lw; n--; sum+=money)
{
scanf("%s %d %d %c %c %d",name,&qm,&py,&gb,&xb,&lw);
money=0;
if(qm>80&&lw)
money+=8000;
if(qm>85&&py>80)
money+=4000;
if(qm>90)
money+=2000;
if(qm>85&&xb=='Y')
money+=1000;
if(py>80&&gb=='Y')
money+=850;
if(ans_money<money)
{
ans_money=money;
strcpy(ans_name,name);
}
}
printf("%s\n%d\n%d",ans_name,ans_money,sum);
}