您的位置:首页 > 其它

NOIP 提高组 初赛 四、阅读程序写结果 习题集(五)NOIP2006-NOIP2007

2016-12-19 15:40 501 查看
NOIP 提高组 初赛 四、阅读程序写结果 习题集(五)NOIP2006-NOIP2007

1.第十二届(NOIP2006)

问题:

1.

//2006.4.1

#include <stdio.h>

int main(){

    int u[4],v[4];

    int i,x,y;

    x=10;

    y=10;

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

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

    v[0]=(u[0]+u[1]+u[2]+u[3])/7;

    v[1]=u[0]/((u[1]-u[2])/u[3]);

    v[2]=u[0]*u[1]/u[2]*u[3];

    v[3]=v[0]*v[1];

    x=(v[0]+v[1]+2)-u[(v[3]+3)%4];

    if(x>10)

        y+=(v[2]*100-v[3])/(u[u[0]%3]*5);

    else

        y+=20+(v[2]*100-v[3])/(u[v[0]%3]*5);

    printf("%d,%d\n",x,y);

    return 0;

}

//{*注:本例中,给定的输入数据可以避免分母为0 或下标越界。)

//输入:9 3 9 4

2.

//2006.4.2

#include <stdio.h>

int main(){

    int m[5]={2,3,5,7,13};

    int i,j;

    long long t;

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

        t=1;

        for(j=1;j<=m[i]-1;j++)

            t*=2;

        t=(t*2-1)*t;

        printf("%lld ",t);

    }

    printf("\n");                                                       

    return 0;

}

3.

//2006.4.3

#include <stdio.h>

const int n=7;

char s[31];

int k,p;

int fun1(char *s,char a,int n){

    int j;

    j=n;

    while(a<s[j]&&j>0)

        j--;

    return j;

}

int fun2(char *s,char a,int n){

    int j;

    j=1;

    while(a>s[j]&&j<n)

        j++;

    return j;

}

int main(){

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

        s[k]='A'+2*k+1;

    k=fun1(s,'M',n)+fun2(s,'M',n);

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

    return 0;

}

4.

//2006.4.4

#include <stdio.h>

void digit(long n,long m){

    if(m>0){

        printf("%2ld",n%10);

        if(m>1){

            digit(n/10,m/10);

            printf("%2ld",n%10);

        }

    }

}

int main(){

    long x,x2;

    printf("Input a number:\n");

    scanf("%ld",&x);

    x2=1;

    while(x2<x)

        x2*=10;

    x2/=10;

    digit(x,x2);

    printf("\n");

    return 0;

}

//输入:9734526

 

问题解答:

1.本题比较简单,按部就班即可做出。

v[0]=(9+3+9+4)/7=3

v[1]=9/((3-9)/4)=-9

v[2]=9*3/9*4=12

v[3]=3*(-9)=-27

x=(3-9+2)-u[(-27+3)%4]=-13

y=10+20+(12*100-(-27))/(u[3%3]*5)=57

此题要注意的地方就是有负数参与除、模运算。

1简单

2.没什么好办法,硬算



答案:6 28 496 8128 33550336

2简单

3.

该题比较简单,一度怀疑做的是普及组试题,上网查证后,才确信是提高组试题。

思考过程如图所示:



答案:11

3简单

4.该题是练递归的好题目,思考过程如图所示:



答案:6254379734526

4简单

2006-12-19 20:33

1.第十三届(NOIP2007)

问题:

1.

//2007.4.1

#include <stdio.h>

int main(){

    int p[6],q[6];

    int i,x,y;

    y=20;

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

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

    q[0]=(p[0]+p[1])+(p[2]+p[3]+p[4])/7;

    q[1]=p[0]+p[1]/((p[2]+p[3])/p[4]);

    q[2]=p[0]*p[1]/p[2];

    q[3]=q[0]*q[1];

    q[4]=q[1]+q[2]+q[3];

    x=(q[0]+q[4]+2)-p[(q[3]+3)%4];

    if(x>10)

        y+=(q[1]*100-q[3])/(p[p[4]%3]*5);

    else

        y+=20+(q[2]*100-q[3])/(p[p[4]%3]*5);

    printf("%d,%d\n",x,y);

    return 0;

}

//输入:6 6 5 5 3

 

2.

//2007.4.2

#include <stdio.h>

void fun(int *a,int *b){

    int *k;

    k=a;

    a=b;

    b=k;

}

int main(){

    int a,b;

    int *x,*y;

    a=3;

    b=6;

    x=&a;

    y=&b;

    fun(x,y);

    printf("No.1:%d,%d ",a,b);

    fun(&a,&b);

    printf("No.2:%d,%d\n",a,b);

}

3.

//2007.4.3

#include <stdio.h>

#include <math.h>

int main(){

    int a1[51]={0};

    int i,j,t,t2,n;

    n=50;

    for(i=2;i<=sqrt(n);i++)

        if(a1[i]==0){

            t2=n/i;

            for(j=2;j<=t2;j++)

                a1[i*j]=1;

        }

    t=0;

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

        if(a1[i]==0){

            printf("%4d",i);

            t++;

            if(t%10==0)

                printf("\n");

        }

    printf("\n");

    return 0;

}

4.

//2007.4.4

#include <stdio.h>

int n=12;

char ch[]={'q','A','S','O','R','T','E','X','A','M','P','L','E'};

void shift(int k,int n){

    char v;

    int j;

    v=ch[k];

    j=k+k;

    while(j<=n){

        if(j<n&&ch[j]<ch[j+1])

            j++;

        if(v<ch[j]){

            ch[j/2]=ch[j];

            j*=2;

        }else

            return;

        ch[j/2]=v;

    }

}

void hpsrt(){

    int k;

    char tmp;

    for(k=n/2;k>0;k--)

        shift(k,n);

    printf("No.1: ");

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

        putchar(ch[k]);

    putchar('\n');

    for(k=n;k>0;k--){

        tmp=ch[1];

        ch[1]=ch[k];

        ch[k]=tmp;

        shift(1,k-1);

    }

}

int main(){

    int k;

    hpsrt();

    printf("No.2: ");

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

        putchar(ch[k]);

    putchar('\n');

    return 0;

}

问题解答:

1.

此题虽然是水题一道,但p与q长得太像,运算过程容易出错。具体过程如下:



答案:129,43

1简单,易错。

2.

涉及指针,看起来挺吓人,实际是,

fun函数中交换的是地址,地址中的变量并未改变。

答案:No1:3,6 No2:3,6

2简单

3.执行程序,过程如下:



因数据量比较小,手动进行数据删除模拟,发现打印的数是质数,经检查,模拟还有数据缺漏,但因此程序本质是打印50以内质数,故很快能写对答案。

答案:



3中等

4.

打印No.1时,没啥感觉,一直模拟,在模拟No.2意识到该程序最终目的是按字典序自小到大排序,此题写答案时也会有个问题,容易将ch[0]='q'误写进答案。

No.1思考过程如下:



No.2思考过程如下:



执行完shift(1,11)基本可以猜到最后结果按字典序,自小到大排列。

本身字符串也有提示:

q A SORT EXAMPLE.

答案:

No.1: XTORSEAAMPLE

No.2: AAEELMOPRSTX

打印No.1要靠模拟,

打印No.2主要靠猜。

4难

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