杭州oj2011-2015

2011题

主要思路是数列中的每个数的绝对值都能在一个循环中表达,只要补上正负号就能完整表达出目标数列,表达出后按照题意相加即可得到答案。

#include <stdio.h>
#include <math.h>
int main(void) { 
    int changdu,i,j,b;
    float c,sum;
    while(scanf("%d\n",&changdu)!=EOF)
    {
       for(i=0;i<changdu;i++)
       {
           scanf("%d ",&b);
           sum=0;
           for(j=1;j<=b;j++)
           {
               c=1.0/j;
               sum+=pow(-1,j-1)*c;
           }
           printf("%.2f\n",sum);
       }
       
    }    return 0;
}

2012题

大体思路就是先用一个循环表达出a,b中的数套用公式后的数,然后在判断其中每个数是不是质数。

#include <stdio.h>
int max(int a,int b);
int min(int a,int b);
int main(void) { 
    int a,b,c,i,j,count=0,f=0,e,ma,mi,d,g;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        if(a==0&&b==0)
        {
            return 0;
        }else
        {
            mi=min(a,b);ma=max(a,b);
            for(i=mi;i<=ma;i++)
            {
                c=i*i+i+41;
                for(j=2;j<c;j++)
                {
                    g=c/j;
                    if(c-g*j==0)
                    {
                        break;
                    }
                    count++;
                }
                e=c-2;//去掉1和本身,循环只进行了c-2次。
            if(count==e){f++;}//如果count=e,则说明这个数是质数
            count=0;
            }
        }   d=ma-mi+1;//代表中间有几个数
            if(f==d){printf("OK\n");}else{printf("Sorry\n");}
            f=0;//如果中间相隔的数和质数的个数一样多,说明成立。
    }
           return 0;
    }

int max(int a,int b)
{if(a>b){return a;}else{return b;}}
int min(int a,int b)
{ if(a<b){return a;}else{return b;}}

2013题

反过来去算f(n-1)=(f(n)+1)*2,一步步递推到第一天。

#include <stdio.h>
int main(void) 
{ 
    int a,sum=1,i;
    while(scanf("%d\n",&a)!=EOF)
    {
        for(i=1;i<a;i++)
     {
        sum=(1+sum)*2;
     }
     printf("%d\n",sum);
     sum=1;
    }
           return 0;
}

2014题

建立一个数组来保存评委的分数,然后重小到大排列一下,去掉头尾相加之和求平均值。

#include <stdio.h>
#include <math.h>
int main(void) { 
    int changdu,j,m,i,n,t;float sum=0,su;
    while(scanf("%d\n",&changdu)!=EOF)
    {
        int shuzu[changdu];
        for(i=0;i<changdu;i++)
     {
        scanf("%d",&shuzu[i]);
     }
        for(j=0;j<changdu;j++)
     {
       for(m=0;m<changdu-1;m++)
       {
           if(shuzu[m]<shuzu[m+1]){t=shuzu[m];shuzu[m]=shuzu[m+1];shuzu[m+1]=t;}
       }
     }
     
     for(n=1;n<changdu-1;n++)
     {
         sum=shuzu[n]+sum;
     }
        su=sum/(changdu-2);
        printf("%.2f\n",su);
        sum=0;
    }
           return 0;
    }

2015题

都是递增的偶数,所以可以用一个循环去表示所有数组的数和这些数的和(tmp,sum),以每m段去分割数组,每经过m段后求一次平均值并打印,清零count和sum,当运算到结尾可能不足m的时候就能直接用sum/count,来输出。

#include <stdio.h>

int main(void) 
{ 
    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;
        sum+=tmp;
        if(i==n){
            printf("%d\n",sum/count);
        }else if(count==m){
            printf("%d " ,sum/m);
            count = 0;sum=0;
        }
    }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值