杭州oj2016-2020

2016题

将输入的数放在一个数组中,在输入的同时去寻找最小数的下标。建立好数组后将最小下标的那个数于第一个数做一个交换。

#include<stdio.h>
int main(){
    int len,i,b=0,min,t;
    while(scanf("%d\n",&len)!=EOF)
    {   if(len==0){return 0;}
        int shuzu[len],min,t;
        for(i=0;i<len;i++)
        {
            scanf("%d",&shuzu[i]);
            if(i==0){min=shuzu[i];}
            if(shuzu[i]<min){min=shuzu[i];b=i;}
        }
        t=shuzu[0];shuzu[0]=shuzu[b];shuzu[b]=t;
        for(i=0;i<len-1;i++)
        {
            printf("%d ",shuzu[i]);
        }printf("%d\n",shuzu[len-1]);b=0;
    }return 0;
    }

2017题

建立一个字符串数组,然后在每个字符串数组中寻找数字同时计数。

#include<stdio.h>
#include <cstring>
int main()
{
    int hangshu,i,count=0,c;
    char a;
    while(scanf("%d",&hangshu)!=EOF)
    {
        for(i=0;i<hangshu;i++)
        {
            char shuzu[100];
            scanf("%s",shuzu);
            for(c=0;c<strlen(shuzu);c++)
            {
                if(shuzu[c]>='0'&&shuzu[c]<='9'){count++;}
            }
            printf("%d\n",count);
            count=0;
        }
    }
  return 0;
}

2018题

我将牛分为老,中,新三种,因为每新出身的牛要第4年才能生育,中间要隔3年,所以有一些中间态不能生育的牛。所以建立三个数组分别代表老,中,新。

主要的递归是

1.今年可以生育的牛等于去年可以生育的牛加上三年前刚出生的牛。

2.中间态的牛等于去年中间态的牛加上去年新生的牛还要减去三年前出生的已经长大的牛。

3.新生的牛就是等于今年可以生育的牛。

不过在前4年并不是按照这个规律,所以要先单独列出。

最后只要输出老中新三组数组最新牛数的总和即可。

#include<stdio.h>
int main()
{
    int year,cow,i,c,b;
    while(scanf("%d\n",&year)!=EOF)
    {
        if(year==0){break;}
        int old_cow[year],middle_cow[year],new_cow[year];
        for(i=0;i<4;i++){old_cow[i]=1;}
        middle_cow[0]=0;middle_cow[1]=0; middle_cow[2]=1;middle_cow[3]=2;
        new_cow[0]=0;new_cow[1]=1;new_cow[2]=1;new_cow[3]=1;
        for(i=4;i<year;i++)
       {  
           old_cow[i]=old_cow[i-1]+new_cow[i-3];
           middle_cow[i]=middle_cow[i-1]+new_cow[i-1]-new_cow[i-3];
           new_cow[i]=old_cow[i];
       }
       printf("%d\n",old_cow[year-1]+middle_cow[year-1]+new_cow[year-1]);
    }
  return 0;
}

2019题

思路是先建立一个数组储存数组,然后找到应该插入的位置,讨论插入位置的不同情况输出不同的数列。就讨论,插入头,尾,中间,三种情况就行。

#include<stdio.h>
#include <cstring>
int main()
{
    int len,charu,i,j,m,n,b=0,k;
    while(scanf("%d %d",&len,&charu)!=EOF)
    {if(len==0&&charu==0){break;} 
    int shulie[len];
        for(i=0;i<len;i++)
       { 
           scanf("%d",&shulie[i]);
       }
       int new_shulie[len+1];
       for(j=0;j<len+1;j++)
       { 
           if(shulie[j]<charu){new_shulie[j]=shulie[j];}else{b=j;break;}
       }
       if(b==0){
           new_shulie[len]=charu; 
           for(m=0;m<len+1;m++)
           {
            if(k=len){printf("%d",new_shulie[k]);}
              else{printf("%d ",new_shulie[k]);}
           }
       }
       else
       {
        new_shulie[b]=charu;
       for(n=b+1;n<len+1;n++)
          {
           new_shulie[n]=shulie[n-1];
          }
       for(k=0;k<len+1;k++)
           {
               if(k==len){printf("%d",new_shulie[k]);}
               else{printf("%d ",new_shulie[k]);}
               
           }
       }printf("\n");
    }
  return 0;
}

2020题

先建立一个数组来储存输入,然后用另一个数组来表示该数组的绝对值数组,然后对绝对值数组用冒泡排列,在改变绝对值数组的顺序时,对原数组也一起进行变化,最后输出原来的数组即可。

#include<stdio.h>
#include <math.h>
int main()
{
    int len,i,j,k,m,n,b,t,d;
    while(scanf("%d",&len)!=EOF)
    {   
        if(len==0){return 0;}  
        int shuzu[len],juedui_shuzu[len];
          for(j=0;j<len;j++)
          {
              scanf("%d",&shuzu[j]);
          }
          for(i=0;i<len;i++)
          {
            juedui_shuzu[i]=abs(shuzu[i]);
          }
    for(k=0;k<len;k++)
    {
          for(m=0;m<len-1;m++)
          {
              if(juedui_shuzu[m]<juedui_shuzu[m+1])
              {
                  t=juedui_shuzu[m];
                  juedui_shuzu[m]=juedui_shuzu[m+1];
                  juedui_shuzu[m+1]=t;
                  d=shuzu[m];
                  shuzu[m]=shuzu[m+1];
                  shuzu[m+1]=d;
              }
          }
    }
          for(n=0;n<len-1;n++)
          {
            printf("%d ",shuzu[n]);
          }
          printf("%d",shuzu[len-1]);
          printf("\n");
    }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值