NOIP 提高组 初赛 四、阅读程序写结果 习题集(五)NOIP2006-NOIP2007
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