2014 青年歌手大奖赛_评委会打分
2014 青年歌手大奖赛_评委会打分
输入数据有多组,每组占一行,每行的第一个数是n(2<n<100),表示评委的人数,然后是n个评委的打分。
要实现的算法是:求整个数组的和、在数组中找最值。
找最值,可以先把第一个元素赋给max、min变量,做一次遍历,一一比较,把最大值存入max,最小值存入min。
也可以直接对数组进行排序,然后从第二个加到倒数第二个,这样就可以了,省去减两个最值。
#include <stdio.h>
int main(void)
{
int n, i;
double min, max;
double x, y;
while (scanf("%d", &n) != EOF)
{
scanf("%lf", &x);
min = max = x;
for (i = 1 ; i < n ; i++)
{
scanf("%lf", &y);
x += y;
if (y > max) max = y;
if (y < min) min = y;
}
printf("%.2lf\n", (x - min - max) / (n - 2));
}
return 0;
}
2013 蟠桃记
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
输入 一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的
逆向分析,每次加一乘二,循环n次。
#include<stdio.h>
int main (void)
{
int n,i,t;
while(scanf("%d",&n)!=EOF)
{
t=1;
for(i=1;i<n;i++)
t=(t+1)*2; //核心,逆向推算
printf("%d\n",t);
}
return 0;
}
2012 素数判定
-
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
#include <iostream> using namespace std; //判定一个数是否为素数,是素数返回1,否则返回0 int check_prime_num(int arg) { if(arg<=0)return 0; else if(arg==1) return 0; else if(arg==2)return 1; else { for(int j=2; j<arg; j++) { //取余等于0,说明除了1和本身外还有其他因数,说明他不是素数,直接返回零 if(arg%j==0) return 0; } return 1; } } int main(void) { int x,y,temp,flag=0; while(cin>>x>>y) { //c=0,y=0就退出 if(x==0&&y==0)break; //判定在输入x,y之间的数后表达式结果为素数的个数 for(int i=x; i<=y; i++) { temp=i*i+i+41; if(check_prime_num(temp)==1) ++flag; } //如果表达式结果素数的个数和输入的个数想等的话,就说明表达式结果都为素数 if(flag==(y-x+1))cout<<"OK"<<endl; else cout<<"Sorry"<<endl; //必须清零,供下一个循环使用 flag=0; } return 0; }
2011 多项式求和
多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …现在请你求出该多项式的前n项的和。
-
输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
#include<stdio.h> int n; double rev(int c) { return c <= n ?( ((c & 1) ? 1.0 : -1.0) / c + rev(c + 1) ): 0 ; } int main() { int t; scanf("%d", &t); while (t-- && scanf("%d", &n)) printf("%.2lf\n", rev(1)); return 0; }
2010 水仙花数
- 要求输出在m和n范围内的水仙花数。
- 但如果你有心,你会发现。其实从1->1000之间,总共也只有5个水仙花数:
1 153 370 371 407
方法一:
#include<stdio.h>
int main()
{
int b, l, c, i;
int a[] = {1, 153, 370, 371, 407};
while (scanf("%d%d", &b, &l) != EOF)
{
c = 0;
for (i = 0 ; i < 5 ; i++)
{
if (a[i] >= b && a[i] <= l)
printf(c++ ? " %d" : "%d", a[i]);
}
printf(c ? "\n" : "no\n");
}
return 0;
}
方法二:计算
int sxh(int m)
{
int sum = 0;
int n = m;
while (n)
{
sum += (n % 10)*(n % 10)*(n % 10);
n /= 10;
}
return sum == m;
}
int main(void)
{
int n, m, c;
while (scanf("%d%d", &m, &n))
{
for (c = 0; m <= n; m++)
{
if (sxh(m))
printf(c++ ? " %d": "%d", m);
}
puts(c ? "\n" : "no\n");
}
return 0;
}
2009 求数列的和
-
开平方函数:
#include <math.h>
double sqrt( double num );#include <math.h> #include <stdio.h> int main(void) { int n; double x, s; while (scanf("%lf%d", &x, &n) != EOF) { for(s = 0.0; n--; x = sqrt(x)) s += x; printf("%.2lf\n", s); } return 0; }
2008 数值统计
-
统计给定的n个数中,负数、零和正数的个数。
#include <stdio.h> int main(void) { int n, i, a, b, c; double x; while (scanf("%d", &n) , n) { a = b = c = 0; for (i = 0 ; i < n ; i++) { scanf("%lf", &x); if (x > 0) c++; else if (x < 0) a++; else b++; } printf("%d %d %d\n", a, b, c); } return 0; }
2007 平方和与立方和
-
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
#include <stdio.h> int main(void) { unsigned int m, n, i, x, y; while (scanf("%u%u", &m, &n) != EOF) { if (m > n) { i = n; n = m; m = i; } x = y = 0; for (i = m ; i <= n ; i++) (i & 1) ? (y += i*i*i) : (x += i*i); printf("%u %u\n", x, y); } return 0; }
2006 求奇数的乘积- 给你n个整数,求他们中所有奇数的乘积。
课外资料:在早期CPU处理的功能还不够强的时候,求X对于2^n
的余数,可能不直接用%来运算。而是换成位运算。 X & (2^N - 1)。 比如求 N 余 8,写成 n & 7。这样写可读性比较差。而且现在的机器性能提升了,一般的编译器也能自动转换这种优化。所以这种写法现在不推荐。仅做了解(当然如果你想炫耀一番自己的才华,那另当别论)。
#include <stdio.h>
int main(void)
{
int n, i, s, t;
while (scanf("%d", &n) != EOF)
{
for (s = 1, i = 0 ; i < n ; i++)
{
scanf("%d", &t);
if (t & 1) s *= t;
}
printf("%d\n", s);
}
return 0;
}
2005 第几天?
给定一个日期,输出这个日期是该年的第几天。
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成
1985/1/20
2006/3/12
判断N是否为闰年的方法是:N能4整数但不能被100整除 或者 N能被400整除
算出第N年的每个月的天数后就从一月开始累加,不要忘了最后要加天数哦。_
#include <math.h>
#include <stdio.h>
#define lev(n) (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0))
int main(void)
{
int y, m, d, i, s;
int month[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
while (scanf("%d/%d/%d", &y, &m, &d) != EOF)
{
for (s = 0, i = 1 ; i < m ; i++)
s += month[lev(y)][i];
s += d;
printf("%d\n", s);
}
return 0;
}
2004 成绩转换
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
#include <math.h>
#include <stdio.h>
int main(void)
{
int r;
while (scanf("%d", &r) != EOF)
{
if (r < 0)
puts("Score is error!");
else if (r < 60)
puts("E");
else if (r < 70)
puts("D");
else if (r < 80)
puts("C");
else if (r < 90)
puts("B");
else if (r < 101)
puts("A");
else
puts("Score is error!");
}
return 0;
}
2003 求绝对值
对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。
#include <math.h>
double fabs( double arg );
#include <math.h>
#include <stdio.h>
int main(void)
{
double r;
while (scanf("%lf", &r) != EOF)
printf("%.2lf\n", fabs(r));
return 0;
}
2002 计算球体积
#include <math.h>
#include <stdio.h>
#define PI 3.1415927
int main(void)
{
double r;
while (scanf("%lf", &r) != EOF)
printf("%.3lf\n", 4.0*PI*r*r*r/3.0);
return 0;
}
2001 计算两点间的距离
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
开平方:
#include <math.h>
double sqrt( double num );
#include <cmath>
#include <cstdio>
int main(void)
{
double x[2], y[2];
while (scanf("%lf%lf%lf%lf", x, y, x+1, y+1) != EOF)
printf("%.2f\n", sqrt((x[1]-x[0])*(x[1]-x[0]) + (y[1]-y[0])*(y[1]-y[0])));
return 0;
}
2000 ASCII码排序
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。 要让三个数从小到大排,顺序就是:
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
char n[4];
while (cin >> n)
{
if (n[0] > n[1]) swap(n[0], n[1]);
if (n[1] > n[2]) swap(n[1], n[2]);
if (n[0] > n[1]) swap(n[0], n[1]);
cout << n[0] << ' ' << n[1] << ' ' << n[2] << endl;
}
return 0;
}