从零开始的C语言之路<二>

来源:互联网 发布:淘宝男鞋店铺 编辑:程序博客网 时间:2024/06/07 07:59

先贴一部分水题

FZU-2229

Yellowstar刚考完微积分期中考,微积分期中考卷一共三个部分,8道选择题每题3分,8道填空题,每题2分,10题答题每题6分,总分100分。Yellowstar考完期中考后已经失去了计算能力,他只记得每部分对的题数,现在想请你帮忙计算一下他的得分,能否通过考试。

难度为0

#include<stdio.h>int main(){    int x,y,z;    int s;    while(scanf("%d%d%d",&x,&y,&z)!=EOF){            s=x*3+y*2+z*6;            if(s>=60){                printf("I passed the exam.\n");                printf("%d\n",s);            }            else{                printf("Exam was too hard.\n");                printf("%d\n",s);            }          }          return 0;}

FZU-2230

象棋翻翻棋(暗棋)中双方在4*8的格子中交战,有时候最后会只剩下帅和将。根据暗棋的规则,棋子只能上下左右移动,且相同的级别下,主动移动到地方棋子方将吃掉对方的棋子。将和帅为同一级别。然而胜负在只剩下帅和将的时候已定。

Input :

第一行T,表示T组数据。

每组数据共有四行字符串,每行字符串共八个字符

’#’表示空格

’*’表示红方帅

’.’表示黑方将

此时红方先走

每组输入之间没有空行。

Output

每组数据输出一行。若为红方赢输出Red win,否则输出 Black win

#include<stdio.h>int main(){    int t;    char a[5][10];    scanf("%d",&t);        while(t--){        int x1,x2,y1,y2,s1,s2,f;        for(int i=0;i<4;i++)            for(int j=0;j<8;j++){                scanf(" %c",&a[i][j]);//这里有个小技巧:一开始再做的时候,提交了几次发现都WA,后来发现是读入回车,在%c前加空格就可以解决这个问题                    if(a[i][j]=='*'){                        y1=i;                        x1=j;                }                    if(a[i][j]=='.'){                        y2=i;                        x2=j;            }        }        s1=x1+y1;        s2=x2+y2;        if(s1>s2)            f=s1-s2;        else            f=s2-s1;        if(f%2!=0)            printf("Red win\n");        else            printf("Black win\n");            printf("%d%d%d%d",x1,y1,x2,y2);    }}

 规律题,题意很简单清晰,思路比较重要,找出规律,这道题就很简单了。

这道题是这样,把图画上坐标轴,当两者的坐标轴x,y的和相减为偶数时,则黑色方赢,当相减为奇数时,红色方赢。

51nod-1433

K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5。小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数。使得这个数尽可能大,而且可以被90整除。

注意:

1.这个数没有前导0

2.K不需要使用所有的牌。

Input:

每个测试数据输入共2行。
第一行给出一个n,表示n张牌。(1<=n<=1000)
第二行给出n个整数a00,a11,a22,…,an1n−1 (aii是0或5 ) 表示牌上的数字。

output:

共一行,表示由所给牌组成的可以被90整除的最大的数,如果没有答案则输出”-1”(没有引号)

#include<stdio.h> int X[2]; int A;int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d",&A);        A==5?X[1]++:X[0]++;    }        if(!X[0]) {        printf("-1");        return 0;        }    while(X[1])    {        int S=X[1]*5;        if(S%9==0)        {            while(X[1]--)                 printf("5");            while(X[0]--)                 printf("0");            return 0;        }        else X[1]--;    }    if(X[0])        printf("0");    else        printf("-1");        return 0;}


一样是规律题,与能被2整除一样,能被90整除的条件就是个个位上的数相加能被9整除且末尾有0,则能被90整除。

这里贴一段最早用桶排做的代码,这里犯了一个问题,把简单问题复杂化,导致超时。


#include<stdio.h>int main(){    int a[10],t;    int n;    for(int i=0;i<=10;i++){            a[i]=0;    }    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d",&t);        a[t]++;    }    if(a[5]*5%9==0&&a[0]!=0){        for(int i=10;i>=0;i--)        for(int j=1;j<=a[i];j++)            {                printf("%d",i);        }    }    if(a[5]*5%9!=0&&a[0]!=0){        printf("0");    }    if(a[0]==0){        printf("-1");    }}

51nod-1413

一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由01组成。例如01101110011都是权势二进制而212900不是。

当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n

当列举几个数字计算时,可以看出规律,就是求数里面的最大数。
#include<stdio.h>int main(){    int n;    scanf("%d",&n);    int a=0;    while(n){        int m=n%10;        if(a<m)            a=m;        n/=10;    }    printf("%d",a);    return 0;}


tip:虽然是水题,但能从水题中进行学习,找出自己的不足,进行弥补,也不失为一种进步的方法。







原创粉丝点击