2014题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2014
题目分析:本题意思是去掉一个最大和一个最小值,然后计算剩余数平均值。输入数据要求是2<n<=100,n表示评委的人数。输出的数据保留2位小数。
错误代码:
#include<stdio.h>
int main()
{
int n,i;
double a[100],max,min,sum;
while(scanf("%d",&n)!=EOF)
{
if(n>=2&&n<=100)
{
for(i=0;i<n;i++) scanf("%lf",&a[i]);
max=min=a[0];sum=0.0;
for(i=0;i<n;i++)
{
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i];
}
for(i=1;i<n-1;i++) sum+=a[i];
printf("%.2lf\n",sum/(n-2));
}
}
return 0;
}
第一次~n次提交:Wrong Answer。原因是我在第二个for语句这里用了max和min,然后将最大值和最小值分别赋值给它们,但是我最初没发现这仅仅只是赋值,不是将数组进行排序,然后经过修改之后得到正确的代码。
正确代码如下:
#include<stdio.h>
int main()
{
int n,i;
double a[100],sum,t;
while(scanf("%d",&n)!=EOF)
{
if(n>=2&&n<=100)
{
for(i=0;i<n;i++) scanf("%lf",&a[i]);
sum=0.0;
for(i=0;i<n;i++)
{
if(a[i]>a[0])
{
t=a[0];
a[0]=a[i];
a[i]=t;
}
if(a[i]<a[n-1])
{
t=a[n-1];
a[n-1]=a[i];
a[i]=t;
}
}
for(i=1;i<n-1;i++) sum+=a[i];
printf("%.2lf\n",sum/(n-2));
}
}
return 0;
}
这代码就是先输入一个评委人数n,并判断n是否在2<n<=100。然后用for语句对数组赋值。然后对数组由大到小进行排序,之后对第2到第n-1个数进行求平均值。
2015题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2015
思路:在长度为n(n<=100)的从2开始的递增有序偶数数列,进行每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。
首先输入n和m。sum是求m个数总和,num会自增到m。然后两个数进行相除可以算出平均值。
代码如下:
#include<stdio.h>
int main()
{
int n,m,i,sum,num;
while(scanf("%d %d",&n,&m)!=EOF)
{
num=0;sum=0;
for(i=2;i<=n*2;i+=2)
{
sum+=i;//一直加到第m个数,然后进行if语句的判断
num++;
if(num==m&&(i!=n*2))//这里i!=n*2不执行最后一个,放到第二条printf执行
{
printf("%d ",sum/num);
num=0;//置0,然后回到前面算第二个m,以此类推。
sum=0;
}
}
if(sum==0&&num==0) continue;//防止n<m的情况
printf("%d\n",sum/num);
return 0;
}
}
2016题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2016
#include<stdio.h>
int main()
{
int n,a[100],i,t,min,j;
while(scanf("%d",&n)!=EOF)
{
if(n>0&&n<100)
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
min=a[0];j=0;
for(i=1;i<n;i++)
{
if(min>a[i])
{
min=a[i];
j=i;
}
}
t=a[j];a[j]=a[0];a[0]=t;
for(i=0;i<n;i++)
{
if(i<n-1)printf("%d ",a[i]);
else printf("%d\n",a[i]);
}
}
}
}
2017题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2017
#include<stdio.h>
#include<string.h>
int main()
{
int n,count,i;
char s[500];
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
count=0;
scanf("%s",s);
for(i=0;i<strlen(s);i++)
{
if(s[i]>='0'&&s[i]<='9') count++;
}
printf("%d\n",count);
}
}
}
2018题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018
#include<stdio.h>
int main()
{
int n,i,a[100]={0,1,2,3,4};
while(scanf("%d",&n)!=EOF)
{
if(n<55&&n>0)
{
for(i=5;i<=n;i++)
{
a[i]=a[i-1]+a[i-3];
}
printf("%d\n",a[n]);
}
}
}
用递推的方法,找到前项和后几项的关系a(n)=a(n-1)+a(n-3)。
2019题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2019
#include<stdio.h>
int main()
{
int n,x,i,j,t,a[100];
while(scanf("%d %d",&n,&x)!=EOF&&n&&x)
{
for(i=0;i<n;i++)scanf("%d",&a[i]);
a[n]=x;
for(i=0;i<=n;i++)
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
{
t=a[i];a[i]=a[j];a[j]=t;
}
}
for(i=0;i<n;i++)printf("%d ",a[i]);
printf("%d\n",a[i]);
}
return 0;
}
将输入的x赋值到数组的最后一个,然后进行排序。
绝对值排序!
2020题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2020
题目解析:输入n(n<=100)个整数,按绝对值从大到小排序后输出。
代码如下:我的思路是调用数学函数库里面的绝对值 fab函数 然后运用if语句判断前后两个数的大小进行排序。
#include<stdio.h>
#include<math.h>
int main()
{
int n,a[105],i,j,t;
while(scanf("%d",&n)!=EOF)
{
if(n>0&&n<=100)
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(fabs(a[i])<fabs(a[j]))
{
t=a[j];
a[j]=a[i];
a[i]=t;}
}
for(i=0;i<n-1;i++)printf("%d ",a[i]);
printf("%d\n",a[i]);
}
}
return 0;
}
查找最大元素
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2025
做题思路:这题先定义一个字符数组,然后进行赋值,在第一个for循环里面对数组里面寻找最大值,将最大值赋值给t。第二个for循环里面把数组里面等于最大值的输出并加上(max)。不等于就输出就行了。
#include<stdio.h>
#include<string.h>
int main()
{
char s[100],t;
int i;
while(gets(s))
{
t='0';
for(i=0;i < strlen(s);i++)
if(s[i]>t)
t=s[i];//寻找最大值
for(i=0;i < strlen(s);i++)
if(s[i]==t)
printf("%c(max)",s[i]);
else
printf("%c",s[i]);
printf("\n");
}
return 0;
}
个人总结:我这周的做题数为十五题,目前做到了2025题,这周的做题的感觉就是有思路,知道要怎么去做这些题。不过程序总是有一点小瑕疵。可能还是自己不够细心。下周可以再加大题量。把学习情况写的更详细。