NOIP 提高組 初賽 四、閱讀程序寫結果 習題集(六)NOIP2008-NOIP2009

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章