题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=11
话不多说,冲!
HDU 2011
前面的老问题,别搞成整除了
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
scanf("%d",&m);
while(m--){
scanf("%d",&n);
double ans=0;
for(int i=1;i<=n;i++){
if(i&1) ans+=1.0/i;
else ans-=1.0/i;
}
printf("%.2lf\n",ans);
}
return 0;
}
HDU 2012
典型的标记变量,以及素数的判定
如何判定k是不是素数呢? 就是找它能不能被[ 2 , sqrt(k) ] 中的任意一个整数整除 ,至于为什么不是[ 2 , k ]可以好好想想
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
if(m==0&&n==0) break;
int flag=1;
for(int i=n+1;i<m;i++){
int now=i*i+i+41;
for(int j=2;j<=sqrt(now);j++){
if(now%j==0){
flag=0;
break;
}
}
}
printf("%s\n",flag?"OK":"Sorry");
}
return 0;
}
HDU 2013
比较简单的递推,应该自己推出来没问题
有点小技巧 整型乘2 可以用左移<<
#include<stdio.h>
#include<math.h>
int main()
{
int n;
while(~scanf("%d",&n)){
int ans=1;
for(int i=1;i<n;i++){
ans=(ans+1)<<1;
}
printf("%d\n",ans);
}
return 0;
}
HDU 2014
思路简单,找到最高最低分数并记录总分,最后的平均分就是 (总分-最高-最低) / (n-2)
#include<stdio.h>
#include<math.h>
int main()
{
int n;
while(~scanf("%d",&n)){
int sum=0,min=0x7fffffff,max=0;
int a;
for(int i=1;i<=n;i++){
scanf("%d",&a);
sum+=a;
if(min>a) min=a;
if(max<a) max=a;
}
printf("%.2lf\n",(sum-min-max)*1.0/(n-2));
}
return 0;
}
HDU 2015
这题作为入门题有点小小的麻烦,我是把它保存在数组里面,然后固定套路输出,可以少考虑一些因素。
这里可以推出一些关系,读者自己推~
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
int ans[105];
while(~scanf("%d%d",&n,&m)){
int len=n/m,q=n%m;
for(int i=1;i<=len;i++){
ans[i]=(m+1)+2*(i-1)*m;
}
if(q){
int sum=0;
for(int i=len*m+1;i<=n;i++){
sum+=i*2;
}
ans[++len]=sum/q;
}
for(int i=1;i<=len;i++){
printf("%d%c",ans[i],i==len?'\n':' ');
}
}
return 0;
}
HDU 2016
这题描述的明显有bug,不知道是不是我语文不好?如果有多个最小值怎么办?其实这题不用考虑多个最小值的情况, 但是这题描述确实有bug,需要注意。
#include<stdio.h>
#include<math.h>
int main()
{
int n;
int f[105];
while(~scanf("%d",&n)&&n){
int min=0x7fffffff,x=-1;
for(int i=1;i<=n;i++){
scanf("%d",&f[i]);
if(min>f[i]){
min=f[i];
x=i;
}
}
int t=f[1];
f[1]=f[x];
f[x]=t;
for(int i=1;i<=n;i++){
printf("%d%c",f[i],i==n?'\n':' ');
}
}
return 0;
}
HDU 2017
还是注意getchar
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n;
char s[1005];
while(~scanf("%d",&n)){
getchar();
while(n--){
gets(s);
int len=strlen(s);
int ans=0;
for(int i=0;i<len;i++){
if(s[i]>='0'&&s[i]<='9') ans++;
}
printf("%d\n",ans);
}
}
return 0;
}
HDU 2018
简单的递推,题目还是没有说清楚,但是可以从样例看出 母牛第二年年初才开始生
可以得到类似于斐波拉契的式子f[i]=f[i-1]+f[i-3];
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n;
int f[60];
f[1]=1; f[2]=2; f[3]=3; f[4]=4;
for(int i=5;i<=55;i++){
f[i]=f[i-1]+f[i-3];
}
while(~scanf("%d",&n)&&n){
printf("%d\n",f[n]);
}
return 0;
}
HDU 2019
这题本来可以按平常的思维直接整体后移(第一种代码)我还写了一种奇怪的边输入边插入的(第二种代码),量力而看~
//普通版
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n,m;
int f[105];
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++){
scanf("%d",&f[i]);
}
int x=n+1;
for(int i=1;i<=n;i++){
if(f[i]>=m){
x=i;
break;
}
}
for(int i=n;i>=x;i--){
f[i+1]=f[i];
}
f[x]=m;
for(int i=1;i<=n+1;i++)
printf("%d%c",f[i],i==n+1?'\n':' ');
}
return 0;
}
//奇怪的
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n,m;
int f[105];
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
int len=0,x;
int flag=1;
while(n--){
scanf("%d",&x);
if(flag&&x>=m){
flag=0;
f[++len]=m;
}
f[++len]=x;
}
if(flag) f[++len]=m;
for(int i=1;i<=len;i++)
printf("%d%c",f[i],i==len?'\n':' ');
}
return 0;
}
HDU 2020
简单的冒泡排序
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n;
int f[105];
while(~scanf("%d",&n)&&n){
for(int i=1;i<=n;i++) scanf("%d",&f[i]);
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
if(abs(f[j])<abs(f[j+1])){
int t=f[j];
f[j]=f[j+1];
f[j+1]=t;
}
}
}
for(int i=1;i<=n;i++){
printf("%d%c",f[i],i==n?'\n':' ');
}
}
return 0;
}