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

来源:互联网 发布:淘宝代购加盟费用 编辑:程序博客网 时间:2024/05/16 08:35

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[n][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

阅读全文
0 0
原创粉丝点击