ACM第二次JKLMNOPQR

来源:互联网 发布:无限的未知知乎 编辑:程序博客网 时间:2024/06/06 08:38

J - 求数列的和
数列的定义如下:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
Sample Input
81 4
2 2
Sample Output
94.73
3.41

#include<stdio.h>#include<math.h>int main(void){    int n,m;    double sum,ai;    while(scanf("%d%d",&n,&m)!=EOF)    {         //初始化设置:第1项         sum=n;         ai=n;         //数列求和         while(--m)         {//更易懂的一般写法:for(i=2;?i<=m;i++)         ai=sqrt(ai);         sum+=ai;         }         //输出结果         printf("%.2f\n",sum);    }    return 0;}

K - 水仙花数
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
Sample Input
100 120
300 380
Sample Output
no
370 371

#include <stdio.h>void main(){    int n,m,i,temp,a,b,c,flag;    while(scanf("%d%d",&m,&n)!=EOF)    {        flag=0;        if(m>n)        {            temp=m;            m=n;            n=temp;            }        for(i=m;i<=n;i++)        {            a=i/100;            b=i%100/10;            c=i%10;            if(i==a*a*a+b*b*b+c*c*c)            {                flag++;                if(flag==1){                printf("%d",i);                }                else                printf(" %d",i);                }            }              if(flag==0)                printf("no");                printf("\n");        }}

L - 多项式求和
多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …
现在请你求出该多项式的前n项的和。
Input
输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
Output
对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。
Sample Input
2
1 2
Sample Output
1.00
0.50

#include <stdio.h>void main(){    int m,n,i,k;    double sum,j;    scanf("%d",&n);    while (n--)    {        scanf("%d",&m);        sum=0;        k=1;        j=1.0;        for (i=1;i<=m;i++)        {            sum=sum+j/k;            k++;            j=-j;        }        printf("%.2f\n",sum);    }}

M - 素数判定
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)
(-39<=x<y<=50),判定该表达式的值是否都为素数。
Input
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
Output
对于每个给定范围内的取值,如果表达式的值都为素数,则输出”OK”,否则请输出“Sorry”,每组输出占一行。
Sample Input
0 1
0 0
Sample Output
OK

#include <iostream>using namespace std;//判定一个数是否为素数,是素数返回1,否则返回0int 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;}

N - 蟠桃记
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵^-^
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30)表示只剩下一个桃子的时候是在第n天发生的。
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
Sample Input
2
4
Sample Output
4
22

#include <iostream>using namespace std;int main(void){    int n,num=1;//最后一天蟠桃数为1,所以初始化num=1    while(cin>>n)    {        while(n>=2)        {            //用第二天的蟠桃数就可以得出第一天蟠桃数            num=(num+1)*2;            n--;        }        cout << num << endl;        num=1;    }    return 0;}

O - 青年歌手大奖赛_评委会打分
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100)表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。
Sample Input

3 99 98 974 100 99 98 97

Sample Output

98.0098.50
#include <stdio.h>void main(){    int n,i;    double avg,max,min,sum,t;    while (scanf("%d",&n)!=EOF)    {        sum = 0;        max = 0;        min = 0;        for (i=0;i<n;i++)        {            scanf("%lf",&t);            sum=sum+t;            if (t>max)                max=t;            else if (t<min)                min=t;        }        avg=(sum-min-max)/(n-2);        printf("%.2f\n",avg);    }}

P - 偶数求和
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7

#include <stdio.h>int main()  {      int n,m;      while (scanf("%d %d",&n,&m)!=EOF)      {          int i,count = 0,tmp = 0,sum = 0;          for (i=1;i<=n;i++)          {              count++;             tmp += 2; //以2开始递增的             sum += tmp;              if (i == n) //如果到了最后一个(不用管是否等于m)。            {                  printf("%d\n",sum / count);              }            else  if (count == m)              {                  printf("%d ",sum / m); //前面按m分开的。                 count = 0; sum =0;              }          }      }      return 0;  }

Q - 数据的交换输出
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。
Output
对于每组输入数据,输出交换后的数列,每组输出占一行。
Sample Input
4 2 1 3 4
5 5 4 3 2 1
0
Sample Output
1 2 3 4
1 4 3 2 5

#include <iostream>using namespace std;int main(){    int n,min,temp,j;    while (cin>>n&&n!=0)    {        int *p=new int[n];//定义指针并指向用new动态分配大小为n的空间        for (int i=0;i<n;i++)        {            cin>>p[i];            if (i==0)            {                min=p[0];                j=0;            }             else            {                if (p[i]<min)                {                    min=p[i];                    j=i;                }             }        }        temp=p[0];        p[0]=min;        p[j]=temp;        for ( i=0;i<n;i++)        {            if (i!=0)            {                cout<<" ";//数与数之间用空格分开            }            cout<<p[i];        }        cout<<endl;        delete p;//记着delete释放空间    }    return 0;}
#include<iostream>using namespace std;const int M=100;int n;int m[M];int main(){     int i,a,a1=0,temp; while(cin>>n&&n>0) {  for(i=0;i<n;i++)  { cin>>m[i];}  a=m[0];a1=0;//记录数组的下标,每次都要归零  for(i=0;i<n;i++)  {   if(m[i]<a)   {   a=m[i];  a1=i; }  } temp=m[0]; m[0]=a; m[a1]=temp; for(i=0;i<n;i++) {   if(i<n-1)   cout<<m[i]<<" ";   else   cout<<m[i]<<endl; }  } return 0;}

R - 字符串统计
对于给定的一个字符串,统计其中数字字符出现的次数。
Input
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
Output
对于每个测试实例,输出该串中数值的个数,每个输出占一行。
Sample Input
2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf
Sample Output
6
9

#include<stdio.h>#include<string.h> int main() {  char a[100];  int i,l,count,n;  scanf("%d",&n);  getchar();   while(n--)   {         gets(a);         count=0;        l=strlen(a);         for(i=0;i<l;i++)             if(a[i]<='9'&&a[i]>='0')                count++;      printf("%d\n",count);  }   return 0; }