您的位置:首页 > 其它

NOIP 提高组 初赛 四、阅读程序写结果 习题集(六)NOIP2008-NOIP2009

2016-12-25 13:08 507 查看
NOIP 提高组 初赛 四、阅读程序写结果 习题集(六)NOIP2008-NOIP2009

1.第十四届(NOIP2008)

问题:

1.

//2008.4.1

#include <stdio.h>

int main(){

    int i,a,b,c,d;

    int f[4];

    for(i=0;i<4;i++)

        scanf("%d",&f[i]);

    a=f[0]+f[1]+f[2]+f[3];

    a/=f[0];

    b=f[0]+f[2]+f[3];

    b/=a;//有些pascal文档,该句有遗漏

    c=(b*f[1]+a)/f[2];

    d=f[(b/c)%4];

    if(f[(a+b+c+d)%4]>f[2]){

        printf("%d\n",a+b);

    }else{

        printf("%d\n",c+d);

    }

    return 0;

}

//输入:9 19 29 39

 

2.

//2008.4.2

#include <stdio.h>

void foo(int a,int b,int c){

    if(a>b)

        foo(c,a,b);

    else

        printf("%d,%d,%d",a,b,c);

}

int main(){

    int a,b,c;

    scanf("%d%d%d",&a,&b,&c);

    foo(a,b,c);

    return 0;

}

//输入:2 1 3

 

3.

//2008.4.3

#include <stdio.h>

void f(int a,int b,int c){

    printf("%d%d%d/",a,b,c);

    if(a==3&&b==2&&c==1)

        return;

    if(b<c)

        f(a,c,b);

    else{

        if(a<b)

            if(a<c)

                f(c,a,b);

            else

                f(b,c,a);

    }

}

int main(){

    int a,b,c;

    scanf("%d%d%d",&a,&b,&c);

    f(a,b,c);

    printf("\n");

    return 0;

}

//输入:1 3 2

 

4.

//2008.4.4

#include <stdio.h>

#include <string.h>

int main(){

    char s[50];

    int i,j,len,k;

    scanf("%s",s);

    len=strlen(s);

    for(i=0;i<len;i++)

        if(s[i]>='A'&&s[i]<='Z')

            s[i]=s[i]-'A'+'a';

    for(i=0;i<len;i++)

        if(s[i]<'x')

            s[i]=s[i]+3;

        else

            s[i]=s[i]-23;

    printf("%s/",s);

    for(j=1;j<4;j++){

        for(i=0;i<len-j;i=i+j){//pascal转C还是略有不同

            s[i]=s[i+j];

        }

    }

    printf("%s\n",s);

    return 0;

}

//输入:ABCDEFGuvwxyz

 

问题解答:

1.水题,但是易错。



答案:23

1简单

2.该题是练习递归的好题。思考过程如图所示:



答案:1,3,2

该题要注意:整个程序printf语句只执行一次,因是if,else语句。

2简单

3.同样是练习递归的好题,注意输出有分隔符'/'。思考过程如图所示:



答案:132/213/231/312/321/

3简单

4.输出第二个字符串之前的处理,j=1简单,j=2开始容易惯性思维,其实是每2位,字符做一个变化,而不是连续的字符做变化。思考过程如图所示:



答案:defghijxyzabc/hfizxjaybcccc

2016-12-25 18:52

4中等

1.第十五届(NOIP2009)

问题:

1.

//2009.4.1

#include <stdio.h>

int work(int a,int b){

    if(a%b)

        return work(b,a%b);

    else

        return b;

}

int main(){

    int a,b;

    scanf("%d%d",&a,&b);

    printf("%d\n",work(a,b));

    return 0;

}

//输入:123 321

 

2.

//2009.4.2

#include <stdio.h>

int main(){

    int a[4],b[4];

    int i,j,tmp;

    for(i=0;i<4;i++)

        scanf("%d",&b[i]);

    for(i=0;i<4;i++){

        a[i]=0;

        for(j=0;j<=i;j++){

            a[i]+=b[j];

            b[a[i]%4]+=a[j];

        }

    }

    tmp=1;

    for(i=0;i<4;i++){

        a[i]%=10;

        b[i]%=10;

        tmp*=a[i]+b[i];

    }

    printf("%d\n",tmp);

    return 0;

}

//输入:2 3 5 7

 

3.

//2009.4.3

#include <stdio.h>

#define maxn 50

const int y=2009;

int main(){

    int n,i,j,s;

    int c[maxn][maxn];

    s=0;

    scanf("%d",&n);

    c[0][0]=1;

    for(i=1;i<=n;i++){

        c[i][0]=1;

        for(j=1;j<i;j++)

            c[i][j]=c[i-1][j-1]+c[i-1][j];

        c[i][i]=1;

    }

    for(i=0;i<=n;i++)

        s=(s+c
[i])%y;

    printf("%d\n",s);

}

//输入:17

 

4.

//2009.4.4

#include <stdio.h>

int main(){

    int n,m,i,j,k,p;

    int a[100],b[100];

    scanf("%d%d",&n,&m);

    a[0]=n;

    i=0;

    p=0;

    k=0;

    do{

        for(j=0;j<i;j++)

            if(a[i]==a[j]){

                p=1;

                k=j;

                break;

            }

        if(p)

            break;

        b[i]=a[i]/m;

        a[i+1]=a[i]%m*10;

        i++;

    }while(a[i]!=0);

    printf("%d.",b[0]);

    for(j=1;j<k;j++)

        printf("%d",b[j]);

    if(p)

        printf("(");

    for(j=k;j<i;j++)

        printf("%d",b[j]);

    if(p)

        printf(")");

    printf("\n");

}

//输入:5 13

 

问题解答:

1.本题是练习递归的好题目。思考过程如图所示:



本题是找最大公约数

答案:3

1简单

2.跟着程序执行,b,a两个数组间进行跳转,容易晕,答案出来了,但该程序有什么用,没搞清。思考过程如下,



答案:5850

2中等偏难

3.跟踪程序,写到i=3发现c的数据是杨辉三角。接下来就是有一定运算量。



答案:487

3中等偏难

此题程序易理解,但是运算十分容易出错。

数学多学一点,总不是坏事。

突然想到,其实就是求C(0,17)+C(1,17)+C(2,17)+......+C(15,17)+C(16,17)+C(17,17)=2^17

2^17=131072

131072%2009=487

这种做法,该题就比较简单了。

3简单

4.思考过程如图所示:



答案:0.(384615)

4中等

该题知道程序作用后,不难,若不清楚程序作用,也能跟踪出结果。

该程序是分数转小数,同时找出循环节。

2016-12-26
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐