P11-2

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值