ACM协会培训I--总结

现在是00:35,这是第一次培训的练习题,严格意义上说是这样。

现在已经都AC了:



错误基本没有,只是出现两次,一次是输出格式少了个换行符,另一个就是运行超时。


感觉还是蛮不错。

第一题:一个水题,没多少意义,只是需要把计算结果转换成拼音 - -!!!(为毛是拼音?这也太掉价了!用英文不显得更高大上?)我就不吐槽了,下面附上代码:

<pre name="code" class="objc">#include<stdio.h>
int main()
{
    char ch;
    unsigned long long int sum=0;
    while(scanf("%c",&ch)!=EOF)
    {
        if(ch>='0'&&ch<='9')
            sum+=ch-'0';
        if(ch==10)
        {
            int a[100000];
            int t;
            for(t=0;;t++)
            {
                a[t]=sum%10;
                sum=sum/10;
                if(sum==0)
                    break;

            }
            int j;
            for(j=t;j>=0;j--)
            {
                if(j!=t)
                    printf(" ");
                if(a[j]==0)
                    printf("ling");
                if(a[j]==1)
                    printf("yi");
                if(a[j]==2)
                    printf("er");
                if(a[j]==3)
                    printf("san");
                if(a[j]==4)
                    printf("si");
                if(a[j]==5)
                    printf("wu");
                if(a[j]==6)
                    printf("liu");
                if(a[j]==7)
                    printf("qi");
                if(a[j]==8)
                    printf("ba");
                if(a[j]==9)
                    printf("jiu");
            }
            printf("\n");
        }
    }
    return 0;
}

第二题,就是二分法处理,提高数据处理速度,错了一次,是忘记了加换行符。

<pre name="code" class="objc">#include<stdio.h>
int main()
{
    int i,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        int j,k,m;
        scanf("%d",&m);
        int a[m];
        for(j=0;j<m;j++)
        {
            scanf("%d",&a[j]);
        }
        int mid=m/2,sum,num,star=0,end=0;
        for(j=0;j<=mid;j++)
        {
            sum=0;
            for(k=j;k<=mid;k++)
            {
                sum=sum+a[k];
                if(k==0)
                    num=sum;
                else if(num<sum)
                {
                    num=sum;
                    star=j+1;
                    end=k+1;
                }
            }
        }
        for(j=0;j<=m/2;j++)
        {
            int s,sum=0;
            for(s=j;s<=m/2;s++)
            {
                sum+=a[s];
            }
            for(k=m/2+1;k<m;k++)
            {
                sum=sum+a[k];
                if(num<sum)
                {
                    num=sum;
                    star=j+1;
                    end=k+1;
                }
            }
        }
        for(j=mid+1;j<m;j++)
        {
            sum=0;
            for(k=j;k<m;k++)
            {
                sum=sum+a[k];
                if(num<sum)
                {
                    num=sum;
                    star=j+1;
                    end=k+1;
                }
            }
        }
        if(i!=1)
            printf("\n");
        if(m==1)
            printf("Case %d:\n%d 1 1\n",i,a[0]);
        else
            printf("Case %d:\n%d %d %d\n",i,num,star,end);
    }
    return 0;
}

第三题,是读取字符转换成数字,半小时就搞定啦,水题一个 o(∩_∩)o:

<pre name="code" class="objc">#include<stdio.h>
int main()
{
    int a[100],t,k,i=0;
    while(1)
    {
        a[i]=getchar();
        if(a[i]=='z')
        {
            a[i]=0;
            getchar();getchar();getchar();getchar();

        }
        else if(a[i]=='o')
        {
            a[i]=1;
            getchar();getchar();getchar();
        }
        else if(a[i]=='t')
        {
            a[i]=getchar();
            if(a[i]=='w')
            {
                a[i]=2;
                getchar();
                getchar();
            }
        else if(a[i]=='h')
            {
                a[i]=3;
                getchar();
                getchar();
                getchar();
                getchar();
            }
        }
        else if(a[i]=='f')
        {
            a[i]=getchar();
            if(a[i]=='o')
                a[i]=4;
            if(a[i]=='i')
                a[i]=5;
            getchar();
            getchar();
            getchar();
        }
        else if(a[i]=='s')
        {
            a[i]=getchar();
            if(a[i]=='i')
                {
                    a[i]=6;
                    getchar();
                    getchar();
                }

            if(a[i]=='e')
                {
                    a[i]=7;
                    getchar();
                    getchar();
                    getchar();
                    getchar();
                }
        }
        else if(a[i]=='e')
        {
            a[i]=8;
            getchar();
            getchar();
            getchar();
            getchar();
            getchar();
        }
        else if(a[i]=='n')
        {
            a[i]=9;
            getchar();
            getchar();
            getchar();
            getchar();
        }
        else if(a[i]=='+')
            {
                t=i;
                getchar();
            }
        else if(a[i]=='=')
        {
            getchar();
            int j,sum1=0,sum2=0;
            for(j=0;j<t;j++)
            {
                sum1=sum1*10+a[j];
            }
            for(j=t+1;j<i;j++)
            {
                sum2=sum2*10+a[j];
            }
            if(sum1==0&&sum2==0)
                return 0;
            else
                printf("%d\n",sum1+sum2);
            i=-1;
        }
        i++;
    }
}

第四题,好扯淡的题

上来就用了错误的方法,测试结果当然对了;我求了所有的素数,超时了,本来要问楷哥的,@K,错误的代码如下:(先吐槽一下,超时60%,是不是学长出的后台数据很坑啊?)
#include<stdio.h>
#include<math.h>
int is_primer(int num)
{
    int k=0,i;
    if(num==1) return 0;
    else if(num==2) return 1;
    else if(num==3) return 1;
    else
    {
        for(i=2;i<=sqrt(num);i++)
        {
            if(num%i==0)
                k++;
        }
        if(k==0) return 1;
        else return 0;
    }


}
 int main()
 {
     int m,n;
     static int a[500005];
     while(scanf("%d%d",&m,&n)!=EOF)
     {
         int i,k,j;
         for(i=2,j=0;j<n;i++)
         {
             k=is_primer(i);
             if(k==1)
                a[++j]=i;
         }
         int t;
         for(t=m,i=0;t<n;t++)
         {
             printf("%d",a[t]);
             i++;
             if(i%10==0)
                printf("\n");
             else
                printf(" ");
         }
         printf("%d\n\n",a[n]);
     }
     return 0;
 }

用筛选法AC了,其实不难,筛选法写了30分钟:
<pre name="code" class="objc">#include<stdio.h>
 #include<math.h>
 int a[8000000]={0},b[500005];
 int main()
 {
     int m,n;     //质数是0,其他是1
     a[0]=1;
     a[1]=1;
     int i,j=0,temp;
     for(i=2;j<=500000;i++)
     {
        if(a[i]==0)
        {
            b[++j]=i;
            temp=2*i;
        }
        while(temp<=8000000)
        {
            a[temp]=1;
            temp+=i;
        }
     }
     while(scanf("%d%d",&m,&n)!=EOF)
     {
         for(i=0;m<n;m++)
         {
             printf("%d",b[m]);
             i++;
             if(i%10==0)
                printf("\n");
             else
                printf(" ");
         }
         printf("%d\n\n",b[n]);
     }
     return 0;
 }

第五题,水题一个,不过这是我第一次用二维数组,有点不熟悉,30分钟多一点才搞完这个水题。

<pre name="code" class="objc">#include<stdio.h> 
int main() 
{ 
    int m,n; 
    while(scanf("%d%d",&m,&n)!=EOF) 
    { 
        int a[m][n],b[m][n]; 
        int i,j; 
        for(i=0;i<m;i++) 
            for(j=0;j<n;j++) 
                b[i][j]=0;              //初始化b[m][n],成立为0,不成立为1 
        for(i=0;i<m;i++) 
            for(j=0;j<n;j++) 
                scanf("%d",&a[i][j]); 
        for(i=0;i<m;i++) 
            for(j=0;j<n;j++) 
            { 
                if(i!=0&&a[i][j]<=a[i-1][j]) 
                    b[i][j]=1; 
                if(i!=m-1&&a[i][j]<=a[i+1][j]) 
                    b[i][j]=1; 
                if(j!=0&&a[i][j]<=a[i][j-1]) 
                    b[i][j]=1; 
                if(j!=n-1&&a[i][j]<=a[i][j+1]) 
                    b[i][j]=1; 
            } 
        int out=0; 
        for(i=0;i<m;i++) 
            for(j=0;j<n;j++) 
            { 
                if(b[i][j]==0) 
                { 
                    printf("%d %d %d\n",a[i][j],i+1,j+1); 
                    out=1; 
                } 
            } 
        if(out==0) 
            printf("None %d %d\n",m,n); 
        printf("\n"); 
    } 
    return 0; 
} 

晚上有点困,看不清屏幕的i和1,m和n;还老是写错,终于搞完了,睡觉觉去了。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值