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