NOIP 提高组 初赛 四、阅读程序写结果 习题集(六)NOIP2008-NOIP2009
2016-12-25 13:08
507 查看
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
[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
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
[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
相关文章推荐
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(六)NOIP2008-NOIP2009
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(五)NOIP2006-NOIP2007
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(一)NOIP1998-NOIP1999
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(八)NOIP2012-NOIP2013
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(四)NOIP2004-NOIP2005
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(八)NOIP2012-NOIP2013
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(三)NOIP2002-NOIP2003
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(七)NOIP2010-NOIP2011
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(七)NOIP2010-NOIP2011
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(一)NOIP1998-NOIP1999
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(二)NOIP2000-NOIP2001
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(五)NOIP2006-NOIP2007
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(三)NOIP2002-NOIP2003
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(九)NOIP2014-NOIP2015
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(三)NOIP2004-NOIP2005
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(二)NOIP2000-NOIP2001
- NOIP 提高组 初赛 三、问题求解 习题集(三)NOIP2006-NOIP2009
- 【用脚趾头解决NOIP】(3)NOIP2010普及组阅读程序写运行结果
- NOIP 提高组 初赛 三、问题求解 习题集(二)NOIP2000-NOIP2005
- NOIP 提高组 初赛 三、问题求解 习题集(二)NOIP2000-NOIP2005