NOIP 普及组 2009 阅读程序写结果题

2009题目一

#include <iostream>
using namespace std;
int a,b;
int work(int a,int b){
	if (a%b)
		return work(b,a%b);
	return b;
}
int main(){
	cin >> a >> b;
	cout << work(a,b) << endl;
	return 0;
}

输入:20 12
输出:4

解析:
主要考察函数递归调用

输入20,12 ,work函数的作用是:如果a求余b的值为true则进行函数递归调用
第一次20求余12 得 8 ,此时条件成立,继续执行work函数,传入参数12,8
第二次12求余8 得 4 ,此时条件成立,继续执行work函数,传入参数8,4
第三次4求余8 得 4 ,此时条件成立,继续执行work函数,传入参数4,4
第三次4求余4 得 0 ,此时条件不成立,结束循环

2009题目二

#include <iostream>
using namespace std;
int main(){
	int a[3],b[3];
	int i,j,tmp;
	for (i=0;i<3;i++)
		cin >> b[i];
	for (i=0;i<3;i++){
		a[i]=0;
		for (j=0;j<=i;j++){
			a[i]+=b[j];
			b[a[i]%3]+=a[j];
		}
	}
	tmp=1;
	for (i=0;i<3;i++){
		a[i]%=10;
		b[i]%=10;
		tmp*=a[i]+b[i];
	}
	cout << tmp << endl;
	return 0;
}

输入: 2 3 5
输出:416

解析:
主要考察数组和for循环

第一个for循环给数组b[0-2]赋值2 3 5。
第二个for循环的循环次数是3次,里面的嵌套循环的次数是1+2+3次
第一次循环:i = 0; a[0]=0; j=0; a[0] = a[0]+b[0]=2; b[2]=b[2]+a[0] = 7
第二次循环:i = 1; a[1]=0; j=0; a[1] = a[1]+b[0]=2; b[2]=b[2]+a[0] = 9
j=1; a[1]=a[1]+b[1]=5; b[2]=b[2]+a[1] = 14
第三次循环:i = 2; a[2]=0; j=0; a[2] = a[2]+b[0]=2; b[2]=b[2]+a[0] = 16
j=1; a[2] = a[2]+b[1]=5; b[2]=b[2]+a[0] = 21
j=2; a[2] = a[2]+b[2]=26; b[2]=b[2]+a[0] = 47
此时数组a[0] = 2 ; a[1] = 5 ; a[2] = 26 ; b[0] = 2 ; b[1]= 3 ; b[2] = 47
第四个for循环的循环次数是3次,每次对a[1-2]和b[1-2]求余取和,然后相乘得结果
tmp 三次变化分别是:4,32,416

2009题目三

#include <iostream>
using namespace std;
const int c=2009;
int main(){
	int n,p,s,i,j,t;
	cin >> n >> p;
	s=0;t=1;
	for(i=1;i<=n;i++)
	{
		t=t*p%c;
		for(j=1;j<=i;j++)
			s=(s+t)%c;
	}
	cout << s << endl;
	return 0;
}

输入:11 2

输出: 782

解析:
主要考察for循环

n = 11,p = 2; s = 0;t=1;
外层for循环一共循环10次,里层for循环一共循环1 ,2,3…10次
每次的变化如下:
t = 1 * 2 % 2009 = 2 S = 2 % 2009 = 2
t = 2 * 2 % 2009 = 4 S = 6 % 2009 = 6 S =10 % 2009 = 10

每次 for循环中 t 的值分别为:2、4、8、16、32、64、128、256、512、1024、39
这里%的优先级比 * 高
每次 for循环后 s 的值分别为:2、10、34、98、258、642、1538、1577、158、353、782

2009题目四

#include <iostream>
using namespace std;
const int maxn=50;
void getnext(char str[]){
	int l=strlen(str),i,j,k,temp;
	k=l-2;
	while(k>=0&&str[k]>str[k+1]) k--;
	i=k+1;
	while(i<l&&str[i]>str[k]) i++;
	temp=str[k];
	str[k]=str[i-1];
	str[i-1]=temp;
	for(i=l-1;i>k;i--)
		for(j=k+1;j<i;j++)
			if(str[j]>str[j+1]){
				temp=str[j];
				str[j]=str[j+1];
				str[j+1]=temp;
			}
	return ;
}
int main(){
	char a[maxn];
	int n;
	cin >> a >> n;
	while(n>0){
		getnext(a);
		n--;
	}
	cout << a << endl;
	return 0;
}

输入:NOIP 3
输出:NPOI

解析:
主要考察

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值