ACM第二次JKLMNOPQR

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,否则返回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;
}

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 97
4 100 99 98 97

Sample Output

98.00
98.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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值