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

来源:互联网 发布:品茗网络计划 添加备注 编辑:程序博客网 时间:2024/05/16 18:30

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


阅读全文
0 0