洛谷【C++编程基础】递归函数初步 专题解题报告

洛谷【C++编程基础】递归函数初步 专题解题报告

T1-T89304 递归求和

题目描述
用递归的方法求1+2+3+4+…+(n-1)+n的值。
输入格式
一个整数n。(1<=n<=10000).
输出格式
一个整数,数列的和。
输入输出样例
输入
10
输出
55

题目出处
题目要求:用递归的方法求1+2+3+4+…+(n-1)+n的值。

#include <bits/stdc++.h>
using namespace std;

int f(int a){
    if(a==1)return 1;//边界
    return (a+f(a-1));//递归关系式
}

int main(){
    int n;
    cin>>n;
    cout<<f(n)<<endl;
    return 0;
}

T2-T89307 Hermite多项式

题目描述
用递归的方法求Hermite多项式的值
对给定的实数x和正整数n,求多项式值。
中间的Hermite图片
输入格式
两个数x,n。用空格隔开。(-1<x<1,1<=n<=20)
输出格式
一个数,函数值。(保留两位小数)
输入输出样例
输入
-0.10 1
输出
-0.20

题目出处
递归关系式已经给出来了,照着写呗。

#include <bits/stdc++.h>
using namespace std;

double n,x;//注意数据类型

double f(double n,double x){
	if(n==0)return 1;
	if(n==1)return 2*x;
	return 2*x*f(n-1,x)-2*(n-1)*f(n-2,x);//照着图片写呗
}

int main(){
	cin>>x>>n;
	cout<<fixed<<setprecision(2)<<f(n,x)<<endl;//题目要求保留两位小数
	return 0;
}

T3-T89310 递归函数求值1

题目描述
已知图片
用递归方法求解。
输入格式
一行有两个整数x和n,用空格隔开。(1<x<30000,1<=n<=10000)
输出格式
一个实数,即函数值。(保留两位小数)
输入输出样例
输入
24499 8564
输出
2.86

题目出处
这一题比上一题略麻烦一点儿,要自己分析。
递归关系:f(x,n)=[n+f(n-1)]/x
边界:n=1时 return (1+x)/x
(或:当n=0时return x)

#include <bits/stdc++.h>
using namespace std;

int n,x;

double f(double x,double n){
	if(n==1)return x/(1+x);
	return x/(n+f(x,n-1));
}

int main(){
	cin>>x>>n;
	cout<<fixed<<setprecision(2)<<f(x,n);
	return 0;
}

T4-T89314 递归函数求值2

题目描述
已知
图片
根据x,n的值计算函数值。
输入格式
用空格隔开的两个数,实数x(0<x<=100),整数n(0<n<=10000).
输出格式
函数值。保留两位小数。
输入输出样例
输入
4.2 10
输出
3.68

题目出处
递归关系:f(x,n)=sqrt(n+f(x,n-1))
边界:当n=1时return sqrt(1+x)
(或:当n=0时return x)

#include <bits/stdc++.h>
using namespace std;

float n,x;

double f(double x,double n){
	if(n==1)return sqrt(1+x);
	return sqrt(n+f(x,n-1));
}

int main(){
	cin>>x>>n;
	cout<<fixed<<setprecision(2)<<f(x,n);
	return 0;
}

T5-T89316 汉诺塔问题

题目描述
如图,设有n个大小不等的中空圆盘,按照从小到大的顺序迭套在立柱A上,另有两根立柱B和C。现要求把全部圆盘从A柱(源柱)移到C柱(目标柱),移动过程中可借助B柱(中间柱)。移动时有如下的要求:
1、一次只许移动一个盘。
2、任何时候任何柱子上不允许把大盘放在小盘上边。
3、可使用任意一根立柱暂存圆盘。
问:如何用最少步数实现n个盘子的移动,请打印出方案。
输入格式
一个整数n(3<=n<=16)
输出格式
输出移动最少的方案,每行表示一次移动,如A->B表示将A柱上最上面的圆盘移动到B柱上。
最后一行输出最少的步数。
图片
输入输出样例
输入
3
输出
A->C
A->B
C->B
A->C
B->A
B->C
A->C
7

题目出处

其实,可以将移动n个圆盘到目标柱理解为将(n-1)个圆盘移动到中间柱+移动第n个到目标柱+将(n-1)个圆盘移动到目标柱
也就是(递归关系式)

hanot(n-1,a,c,b);//(n-1)个圆盘移动到中间柱
cout<<a<<"->"<<c<<endl;//移动第n个到目标柱
hanot(n-1,b,a,c);//将(n-1)个圆盘移动到目标柱

边界

if(n==1)将这根柱子移动到目标柱

由于题目要步数,就设成了有返回值的(也可以定义全局变量替代)

#include <bits/stdc++.h>
using namespace std;

int n;

int hanot(int n,char a,char b,char c){//a目标柱,b中间柱,c目标柱
	if(n==1){
		cout<<a<<"->"<<c<<endl;
		return 1;	
	}
	int ans=1;
	ans+=hanot(n-1,a,c,b);
	cout<<a<<"->"<<c<<endl;
	ans+=hanot(n-1,b,a,c);
	return ans;
}

int main(){
	cin>>n;
	cout<<hanot(n,'A','B','C')<<endl;
	return 0;
}

T6-T90615 字符串逆序

题目描述
输入一串以‘!’结束的字符,按逆序输出。(请用递归完成)
输入格式
一行字符串(以!结束)(字符串长度不超过100)
输出格式
逆序输出。
输入输出样例
输入
abc!
输出
!cba

题目出处
这是我一开始的程序:

#include <bits/stdc++.h>
using namespace std;

string s;

string f(string s){
	int pos=s.size();
	if(pos==1)return s;
	char er=s[pos-1];
	string st;
	for(int i=0;i<pos-1;++i)
		st+=s[i];
	return er+f(st);
}
int main(){
	cin>>s;
	cout<<f(s)<<endl;
	return 0;
}

现在发现太繁琐:

#include <bits/stdc++.h>
using namespace std;

string s;
int pos;//全局变量,以便用于递归(当然,可以通过传参代替)

void f(int n){
	if(n<pos-1)f(n+1);//边界
	cout<<s[n];//逆序输出(很像出栈序列,嘿嘿)
} 

int main(){
	cin>>s;
	pos=s.size();
	f(0);
	cout<<endl;
	return 0;
}

呸呸,更正!!!
测试数据太弱了,竟然没测出BUG!!!
(将

cin>>s;

改为

getline(cin,s);


当然,还可以这样做:

#include <bits/stdc++.h>
using namespace std;

int pos;

void f(){
	char fox;
	cin>>fox;
	if(fox=='!'){
		cout<<"!";
		return;
	}//边界
	f();
	cout<<fox;
} 

int main(){
	f();
	cout<<endl;
	return 0;
}

但注意!!!这个的BUG也是不能输入空格。将

cin>>fox;

改为

fox=getchar();

即可。

T7-T90627 费波那契数列

1,1,2,3,5,8,13,…
这是著名的斐波那契(Leonardo Pisano ,Fibonacci, Leonardo Bigollo,1175-1250)发现的数列。其中,每两项都等于前二项之和(第1,2项是1)。

题目描述
1,1,2,3,5,8,13,21,34,55……从第三项起,每一项都是紧挨着的前两项的和。
以上就是斐波那契数列。
输入第几项,输出第几项的值。(请用递归完成)
输入格式
一个正整数n,<=30
输出格式
第n项的值
输入输出样例
输入
4
输出
3

题目出处
递归关系:f(n)=f(n-1)+f(n-2)
边界:当n==1或2时return 1
代码

#include <bits/stdc++.h>
using namespace std;

long long n,dp[110];//dp为记忆化数组,以空间换时间(当然本题数据较小,可以不用记忆化,并且可以不开long long)

long long f(long long n){
	if(n<=2){
		return 1;
	}//边界
	if(dp[n])return dp[n];
	dp[n]=f(n-1)+f(n-2);
	return dp[n];
} 

int main(){
	cin>>n;
	cout<<f(n)<<endl;
	return 0;
}

当然,还得展示一下我个人的奇葩代码,思路奇怪。(简直不能说是递归)像函数实现for循环

#include <bits/stdc++.h>
using namespace std;

int n,s=2;

int f(int a,int b){
	++s;
	int c=a+b;
	if(s==n)return c;
	return f(b,c);
}

int main(){
	cin>>n;
	if(n==1||n==2)cout<<1<<endl;
	else cout<<f(1,1)<<endl;
	return 0;
}

当然,再展示一下for循环代码

#include <bits/stdc++.h>
using namespace std;

long long n,dp[110];

int main(){
	cin>>n;
	dp[1]=dp[2]=1;
	for(int i=3;i<=n;++i)dp[i]=dp[i-1]+dp[i-2];
	cout<<dp[n]<<endl;
	return 0;
}

T8-T90628 F91

题目描述
麦卡锡是一个有名的计算机科学专家,在他的著作中,他定义了一个被称为"F91"的递归函数,这个函数是这样获得的:输入一个正整数N,按如下定义返回一个正整数:
If N ≤ 100, then f91(N) = f91(f91(N+11));
If N ≥ 101, then f91(N) = N-10
编写程序计算出麦卡锡的F91函数
输入格式
输入数据包含一系列的正整数,每个正整数最大不超过1,000,000,每个正整数占一行,当遇到数字0时表示输入结束。注意数字0不是测试数据,仅代表结束标志。
输出格式
输出数据每行应包含一个测试结果,具体格式见输出样例,等号两侧各有一个空格。
输入输出样例
输入
91
622
1997
0
输出
f91(91) = 91
f91(622) = 612
f91(1997) = 1987
说明/提示
输入数据保证你用直接递归不会超时。

题目出处
既然题目给出了递归关系式,并保证“直接递归不会超时”,那就写呗。

#include <bits/stdc++.h>
using namespace std;

int s=1;

int f(int s){
	if(s<=100)return f(f(s+11));//递归关系
	return s-10;
}
int main(){
	while(s!=0){
		cin>>s;
		if(s!=0){
			cout<<"f91("<<s<<")"<<" = "<<f(s)<<endl;
		}
	}
	return 0;
}

T9-T90630 最大公约数与最小公倍数

题目描述
输入两个数,求他们的最大公约数和最小公倍数。(请用递归完成)
输入格式
输入一行,两个正整数。
输出格式
输出一行,两个正整数(这两个正整数的最大公约数和最小公倍数),用一个空格隔开。
输入输出样例
输入
18 20
输出
2 180
说明/提示
所有数据保证小于2^31-1

题目出处
既然是最大公约数,肯定用“辗转相除法”。不了解的同学推荐看这篇C++辗转相除法详解,而最大公倍数就是(设最大公约数为x)(a/x)*(b/x)x=ab/x。可以参考这篇最大公约数和最小公倍数的关系
这题要递归实现(平常用的是迭代实现)
递归关系:f(a,b)=f(b,a%b)
边界:b==0时return a
附上我一开始的代码:

#include <bits/stdc++.h>
using namespace std;

int f(int a,int b){
    int c=b;
    b=a%b;
    a=c;
    if(b==0)return a;
    return f(a,b);
}
int main(){
    int n,a;
    cin>>n>>a;
    cout<<f(n,a)<<" "<<n*a/f(a,n);
    return 0;
}

发现一种简洁优美的写法:(不会"? : "的同学可以看这篇C++中“?”的意思

#include <bits/stdc++.h>
using namespace std;

long long a,b;

long long f(long long a,long long b){
	return b?f(b,a%b):a;
}

int main(){
	cin>>a>>b;
	cout<<f(a,b)<<endl;
	return 0;
}

T10-T90632 十进制转八进制

题目描述
把任一给定的十进制正整数(<=32000)转换成八进制数后输出。(请用递归完成)
输入格式
一个十进制数。
输出格式
转换后的八进制数
输入输出样例
输入
100
输出
144

题目出处
额……先来演示一下通常做法:

#include <bits/stdc++.h>
using namespace std;

long long a,b,i=1;

int main(){
	cin>>a;
	while(a>0){
		b+=a%8*i;
		a/=8;
		i*=10;//算位权
	}
	cout<<b<<endl;
	return 0;
}

简洁吧。。。下一步演示递归:

#include <bits/stdc++.h>
using namespace std;

int f(int n){
	if(n<8)return n;//也可以将边界改为0
	return n%8+f(n/8)*10;
}

int main(){
	int n;
	cin>>n;
	cout<<f(n)<<endl;
	return 0;
}

还可以这么做

#include <bits/stdc++.h>
using namespace std;

void f(int n){
	if(n/8)f(n/8);
	cout<<n%8;//逆序输出
}

int main(){
	int n;
	cin>>n;
	f(n);
	return 0;
}

T11-T90633 走台阶

题目描述
楼梯有n阶台阶,上楼可以一步上一阶,也可以一步上二阶。用递归的方法编一程序计算共有多少种不同的走法。(试用递归完成,会出现什么问题,如何解决)
输入格式
一个正整数n(n不超过90)
输出格式
一个整数,表示走法方案数。
输入输出样例
输入
4
输出
5

题目出处
我第一秒想到的是暴力……(造化低了)33分

#include <bits/stdc++.h>
using namespace std;

int n,cnt;

void f(int s){
	if(s==n){
		++cnt;
		return;
	}
	if(s>n)return;
	for(int i=1;i<=2;++i)
		f(s+i);
	return;
}

int main(){
	cin>>n;
	f(0);
	cout<<cnt<<endl;
	return 0;
}

仔细对比数据,竟发现答案是斐波那契数列!!!
自制奇葩递归

#include <bits/stdc++.h>
using namespace std;

long long n,ans,vh[100];

void f(int s){
	if(s<3){
		if(s==2)cout<<3<<endl;
		else cout<<s<<endl;
		return;
	}
	vh[s]=vh[s-1]+vh[s-2];
	if(s==n){
		cout<<vh[s]<<endl;
		return;	
	}
	f(s+1);
	return;
}

int main(){
	vh[0]=1;//这一行加上只是为了对比发现斐波那契,可删除
	vh[1]=1;
	vh[2]=2;
	cin>>n;
	f(3);
	return 0;
}

标程:

#include <bits/stdc++.h>
using namespace std; 

long long dp[110];//记忆化
long long f(long long n){
	if(dp[n])return dp[n];
	if(n<=2)return n;//注意这个地方与标准斐波那契不同(因为这一题第n个答案是第(n+1)个斐波那契数,忘记的同学可以向上翻翻T7,这里原是return 1)
	else dp[n]=f(n-1)+f(n-2);
	return dp[n];
}

int main(){
	int n;
	cin>>n;
	cout<<f(n)<<endl;
	return 0;
}

刨根问底的同学可以继续看:
QUESTION:为什么答案是斐波那契数列?
ANSWER:上面我们用的是归纳的方法。下面主要介绍原因:
第1,2个台阶分别有1,2种走法(1)(1+1或2)
而从第3个开始,每一个数目(假设是第n个(n>2))都可以理解为第(n-1)的走法再走1级台阶或第(n-2)的走法再走2级台阶,自然就有第(n-1),第(n-2)的走法总数和数量的方法。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1基础_2.由计算机生成简单的四则运算 1.1 需求分析: 本主要是要求设计一个可以自动生成四则运算的测试器,并且完全由用户决定出加、减、乘、除哪一种运算,以及出一位数还是两位数的运算,同时还要对用户给出的答案的对错进行判断。在程序运行过程,用户可以选择何时结束程序,并在结束程序时给出一个某种形式的成绩。 ///////////////////////////////////////////// 程序执行的结果://///////////////////////////////////////////////// 1.2 概要设计: 在对目理解的基础上,并针对几个特别的技术环节,我认为程序可分为三个部分: 1) 程序的欢迎界面,主要通过一些特殊制表符来完成。其运行,退出程序可以通过一个while循环来判定同时还要考虑用户输入信号量的正误; 2) 出函数,也是本程序最关键的一个函数,通过使用“rand()%10”或“rand()%100”来获得一个0到9的一位整数随机值或得到0到99的两位整数随机值来为用户出,并判断用户答案的对错; 3) 评分系统,是在用户选择退出后对用户所答情况给出的成绩评价。 /////////////////////////////////////////////////// 程序流程图: 1.3 详细设计与编码: 为了使程序更加简洁与工整,且容易修改和阅读,我采用头文件的方式将Exam()函数放在了Exam .h。Exam()函数主要负责程序的出和结果的判断,其输入接口为运算符号,位数,即只需向其输入四则运算的一种符号和运算的位数,函数便自动生成目并自动判断结果的正误,结果以1,0返回。而主程序则是完成了程序的开始、结束,用户成绩的判定。 /////////////////////////////////////////////////// 具体源程序如下: ---------------------------------------------------------------------------------------------------------------------- int Exam(int figure, int sign) {//本函数负责给用户出 if (figure!=1&&figure!=2&&sign<1&&sign>4) return 0; //判断函数的输入是否符合要求 int a, b; if (figure==1) a=rand()%10; b=rand()%10; if (figure==2) a=rand()%100; b=rand()%100; switch(sign) { case(1): { cout<<" "<<a<<'+'<<b<<'='; int r; cin>>r; if(r!=a+b) { cout<<" "<<"╳ 很遗憾,回答错误! X﹏X "<<endl; return -1; } else { cout<<" "<<"√ 恭喜你回答正确!↘(^ω^)↙"<<endl; return 1; } } case(2): { cout<<" "<<a<<'-'<<b<<'='; int r; cin>>r; if(r!=a-b) { cout<<" "<<"╳ 很遗憾,回答错误! X﹏X "<<endl; return -1; } else { cout<<" "<<"√ 恭喜你回答正确!↘(^ω^)↙"<<endl; return 1; } } case(3): { cout<<" "<<a<<'*'<<b<<'='; int r; cin>>r; if(r!=a*b) { cout<<" "<<"╳ 很遗憾,回答错误! X﹏X "<<endl; return -1; } else { cout<<" "<<"√ 恭喜你回答正确!↘(^ω^)↙"<<endl; return 1; } } case(4): { while(b==0) b=rand()%10; cout<<" "<<a<<'/'<<b<<'='; int r; cin>>r; if(r!=a/b) { cout<<" "<<"╳很遗憾,回答错误! X﹏X "<<endl; return -1; } else { cout<<" "<<"√ 恭喜你回答正确!↘(^ω^)↙"<<endl; return 1; } } } return 0; } ---------------------------------------------------------------------------------------------------------------------- main() 见上传程序 Arithmetic . cpp文件 1.4 调试分析: 为了使程序的欢迎界面更加的友好,我采用了制表符来美化程序界面,让整个程序不会显得那么的单调和无趣。在调试过程,为了使界面好看确实下了很大的功夫。 在调试过程程序使用"rand()%10"或"rand()%100" 获得的随机数往往不随机,即获得的随机数不变,经过查阅资料和详细分析,原来它需要初始化。 1.5 用户使用说明: 友好的程序界面给人一种亲切感,整个程序使用起来并不是十分的复杂,只需要根据每步的提示进行即可。至于在进行除法运算时,面对无法除尽的数用户只需要保留小数点后一位数字即可。 1.6 设计心得: 设计制作类似的程序已经不是第一次了,但这次却是比以前各次都下了大功夫。虽然整个目并不是很难,出函数也比较容易实现,但我抓住了程序界面的设计,让整个程序变得友好而吸引人。然原本枯燥的四则运算测试变得有意思。而且通过这次的编程,使我对设计一个程序的步骤更加的熟悉,为后面的加强打下了坚实的基础。 运行程序后,看到自己完全独立设计制作的程序,一种无比的自豪感油然而生,内心掩饰不住的喜悦。特别是听到在同学们看到我的程序界面时发出的感叹声时,心里也是无比的开心。 2基础_6.钱币兑换问(贪心算法) 2.1 需求分析: 本主要是要求设计一个程序,让用户输入正整数m ,它代表一个人民币钱数(元数),由程序计算一个最有方法,使人民币纸币的张数最少,并凑成上述的钱数m 。 ///////////////////////////////////////////// 程序执行的结果://///////////////////////////////////////////////// 2.2 概要设计: 在对目理解的基础上,以及所给出的要求,我认为此问最好还是选用贪心算法会比较方便。而且由于此问也恰巧是贪心算法的最典型应用,即所求问的整体最优解可以通过一系列局部最优的选择来达到。 /////////////////////////////////////////////////// 程序流程图: 2.3 详细设计与编码: 根据上面的流程图可以看到如果是一步一步的写程序,势必会让程序变得冗长且不易阅读,因而我想到使用循环的方法,将流程图类似的结构体做成一个循环体来实现,使程序源代码变得十分的简洁,且容易被阅读和修改。 /////////////////////////////////////////////////// 具体源程序如下: ---------------------------------------------------------------------------------------------------------------------- void main() { cout<<"请输入总钱数 m"; int m=0; cin>>m; int N[7]={0,0,0,0,0,0,0}; //用来存储每种面值纸币所需的数目 int Money[7]={100,50,20,10,5,2,1}; //存放7种纸币的面值 for (int i=0; i<7; i++) { while (m>=Money[i]) { m-=Money[i]; N[i]++; } } cout<<"最少使用"<<endl; for (i=0; i<7; i++) { cout<<"\t面值"<<setw(3)<<Money[i] <<"的纸币"<<N[i]<<"张"<<endl; } } ---------------------------------------------------------------------------------------------------------------------- 2.4 调试分析: 本程序的调试工作显得非常的简单,只需要对几个特殊的值进行检查就行了。程序输出也是十分的清晰,容易查错。这主要是由于问并不是十分复杂,再加上贪心算法的简便性。使得整个程序浑然一体。 2.5 用户使用说明: 在程序运行后需要用户输入需要兑换的总钱数,回车后系统便自动将各种纸币所需要的张数输出来。供用户参考。且输出的结果是张数最少的情况。 2.6 设计心得: 钱币兑换问是个非常简单的目,完成本所需的编程技巧并不多,但却巩固了我在算法设计与分析课上所学到的很多知识。特别是对于贪心算法,不但让我对其有了更进一步的了解,而且使我能够更好的掌握在分析问时,首先对问的解决算法进行分析的能力。 3基础_9.约瑟环问(使用数组存放人员编号) 3.1 需求分析: 本主要是要求设计一种算法,使用数组来存放n个人,而后从1号人员开始报数(顺时针方向),当数到k时(其k>1由用户通过cin输入指定),则该号人员被“淘汰出局”;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从1开始数起,数到k后,淘汰第2个人;如此继续,直到最后剩下一个人时停止。请输出最后所剩那一个人的编号,并输出淘汰过程的某种“间结果数据”。 ///////////////////////////////////////////// 程序执行的结果://///////////////////////////////////////////////// 3.2 概要设计: 在对目理解的基础上,以及所给出的要求,我认为此问可以通过模拟指针循环查找的方法来实现目所给的限定。在淘汰人员时,我准备利用一个布尔数组来存放这n个人的状态(是否被淘汰),然后通过一个point"指针"对其进行循环查找。而另定义一个j变量来进行报数操作。不但可以实现在时下最后一个人时输出这个人的编号,还可以在每次淘汰人员时,输出被淘汰人员的编号。 /////////////////////////////////////////////////// 程序流程图: 3.3 详细设计与编码: 因为总人数是由用户所给定的,所以主函数内的所有涉及n的数组都需要使用动态数组来进行定义。整个报数环节在主函数体现在一个while循环上,而跳出这个循环的条件便是对队列人数的判断,即当队列的人数只剩下一个时,跳出此循环。 /////////////////////////////////////////////////// 具体源程序如下: ---------------------------------------------------------------------------------------------------------------------- void main() { int n, k; cout<<"请输入总人数 n:"; cin>>n; cout<<"请输入报数的最大值 k:"; cin>>k; bool *p=new bool[n+1]; //布尔 p 数组用来存放 n 个人的状态 for (int i=1; i<=n; i++) p[i]=1;//1 状态在队列里 0 被淘汰了 int point=0, j=0, m=n; //point 编号指针 j 报数 m 队列里剩有的人数 while (true) { j++; point++; if (point==n+1) point=1; //point 指向 n+1 是转到1 while (p[point]==0) { point++; if (point==n+1) point=1; } if (j==k) //报数报到 k { p[point]=0; cout<<"编号为 "<<point<<" 的人被淘汰了。"<<endl; m--; j=0; } if (m==1) break; //队列只剩下1个人时跳出循环 } point=1; while (p[point]==0) point++; cout<<"最后剩下的人的编号为 "<<point<<" 。"<<endl; } ---------------------------------------------------------------------------------------------------------------------- 3.4 调试分析: 本程序的调试并不怎么复杂,但却有点麻烦。因为为了测得程序运行的正确性,在输入n之前,我总是要先把正确的答案计算出来,再对程序的结果进行比较。其也难免自己计算错误的时候,况且n的值越大,其产生的结果也就越繁多,因而比较耗时。 在整体的调试下,本程序并没有出现错误,在对每步输出上也是比较完美的,达到了预先设定的效果。 3.5 用户使用说明: 在程序运行后需要用户输入排成一圈的总人数n,接着会让用户输入报数的最大值k,这两个数理论上在大小上没有限制,但输入的必须是整型正整数,否则系统会报错。在程序输出时,每一步所淘汰的成员编号都会被输出,因而用户可以清晰地看到整个的淘汰过程。并可由最后输出的结果知道最后会剩下哪个编号的成员。 3.6 设计心得: 约瑟环问是一个比较老的问了,在刚接触C++语言时就做过类似的目,因而完成起来并没有太大难度。虽然在对设计时所使用的数据结构进行了限制,但这并不是本的难点,我认为关键在于超越自我,设计出与我过去编程时所设计出的程序有所不同。我觉得我做到了,这次的程序是我完全重新设计的,从算法到数据结构的使用均是独立完成,感到很有成就感。 4基础_11.猜扑克牌问 4.1 需求分析: 本主要是要求设计一个程序,能让计算机来猜测用户“暗记”的某张扑克牌:计算机从一副扑克牌(54张)任意抽出27张,摆放在不同的三行上(每行9张),用户“暗记”某张纸牌,而后告诉计算机所“暗记”的那张纸牌处于哪一行;之后计算机再两次将纸牌重新摆放,并让用户再回答两次相同的提问(那张纸牌在重新摆放后又处在哪一行上);此时计算机会将用户所“暗记”的那张纸牌给挑出来。 ///////////////////////////////////////////// 程序执行的结果://///////////////////////////////////////////////// 4.2 概要设计: 在对目理解的基础上,以及所给出的要求,我认为此问有以下两个重点: 1)要从一副54张的扑克牌任意抽出27张,可通过“rand()%54”所产生的随机值来确定。但注意,一旦随机抽走哪张,下次牌就没有这张了。 2)程序总按照一种策略将三行纸牌重新“摆放”,而后进一步让用户进行指定。上述所谓的策略指的是,总将纸牌“一分为三”:第一次要将每一行的9张分散到不同的3行上(每行仅“剩”3张),而第二次则要将上次“确定”出的某3张进一步分散到不同的3行上(每行只“剩”1张。此时靠用户再指定一次行号则可唯一确定所“暗记”的那张纸牌)。 /////////////////////////////////////////////////// 程序流程图: 4.3 详细设计与编码: 有很多地方都涉及到无序排列的问,再加上一旦随机抽走哪张,下次牌就没有这张了,而且在分组完成后数据的存放都是一个问。所以我采用布尔变量数组来存放牌的状态(抽走了为0,未抽走为1)。而使用string数组来存放每一张牌。在输出的问上,我将无须输出和有序输出函数单独做成一个头文件:OutWay.h ,以方便函数的调用于阅读。为解决目的最终问,在流程图的交换操作需要下一些功夫才能很好的完成。 /////////////////////////////////////////////////// 具体源程序如下: ---------------------------------------------------------------------------------------------------------------------- void main() { srand(GetTickCount()); //使rand()函数每次所取得随机数不同 string squeezer[54]={"\3- A","\3- 2","\3- 3","\3- 4","\3- 5","\3- 6","\3- 7","\3- 8","\3- 9", "\3-10","\3- J","\3- Q","\3- K","\4- A","\4- 2","\4- 3","\4- 4","\4- 5", "\4- 6","\4- 7","\4- 8","\4- 9","\4-10","\4- J","\4- Q","\4- K","\5- A", "\5- 2","\5- 3","\5- 4","\5- 5","\5- 6","\5- 7","\5- 8","\5- 9","\5-10", "\5- J","\5- Q","\5- K","\6- A","\6- 2","\6- 3","\6- 4","\6- 5","\6- 6", "\6- 7","\6- 8","\6- 9","\6-10","\6- J","\6- Q","\6- K","KING1","KING2"}; //顺序列出54张牌 cout<<"The 54 cards aring in proper order is arranged as follows: "<<endl; Order_Out(squeezer, 54); string draw[27]; //存放随机抽取出来的27张牌 string line1[9], line2[9], line3[9]; //分别存放从27张牌抽取出的9张牌 bool a1[54], a2[27]; //状态参数,a1用来存放第一次随机抽取时54张牌的状态 //a2用来存放第二次随机抽取时27张牌的状态 for (int i=0; i<54; i++) a1[i]=true;//状态初始化 for (i=0; i<27; i++) a2[i]=true;//状态初始化 int b; //用来产生随机数 for (i=0; i<27; i++) { b=rand()%54; //产生0~53之间的随机数 while(a1[b]==false) b=rand()%54; //产生0~53之间的随机数 a1[b]=false; draw[i]=squeezer[b]; } cout<<"The 27 cards sampled are arranged as follows: "<<endl; Order_Out(draw, 27); //顺序列出抽取出的27张牌 for (i=0; i<9; i++) { b=rand()%27; //产生0~27之间的随机数 while(a2[b]==false) b=rand()%27; //产生0~27之间的随机数 a2[b]=false; line1[i]=draw[b]; } for (i=0; i<9; i++) { b=rand()%27; //产生0~27之间的随机数 while(a2[b]==false) b=rand()%27; //产生0~27之间的随机数 a2[b]=false; line2[i]=draw[b]; } for (i=0; i<9; i++) { b=rand()%27; //产生0~27之间的随机数 while(a2[b]==false) b=rand()%27; //产生0~27之间的随机数 a2[b]=false; line3[i]=draw[b]; } cout<<"-------------------------------------"<<endl <<"line1:"; Orderless_Out(line1, 9); //无序输出line1 cout<<"line2:"; Orderless_Out(line2, 9); //无序输出line2 cout<<"line3:"; Orderless_Out(line3, 9); //无序输出line3 cout<<"-------------------------------------"<<endl <<"Remember a card, and tell me what line it reside in (1/2/3): "; int c; //用户输入的信号量 cin>>c; while (c<1||c>3) { cout<<"Sorry, your importation contain mistake, please reinput: "; cin>>c; } switch(c) {//将用户选出的一行分成3份,分布到每一行 case 1: { for (i=3; i<6; i++) swap(line1[i], line2[i]); for (i=6; i<9; i++) swap(line1[i], line3[i]); break; } case 2: { for (i=0; i<3; i++) swap(line2[i], line1[i]); for (i=6; i<9; i++) swap(line2[i], line3[i]); break; } case 3: { for (i=0; i<3; i++) swap(line3[i], line1[i]); for (i=3; i<6; i++) swap(line3[i], line2[i]); break; } } cout<<"-------------------------------------"<<endl <<"line1:"; Orderless_Out(line1, 9); //无序输出line1 cout<<"line2:"; Orderless_Out(line2, 9); //无序输出line2 cout<<"line3:"; Orderless_Out(line3, 9); //无序输出line3 cout<<"-------------------------------------"<<endl <<"What line the card you remenbered reside in now (1/2/3): "; cin>>c; while (c<1||c>3) { cout<<"Sorry, your importation contain mistake, please reinput: "; cin>>c; } switch(c) {//将用户选出的一行的3个可能值,分布到每一行的首位 case 1: { swap(line1[1], line2[0]); swap(line1[2], line3[0]); break; } case 2: { swap(line2[3], line1[0]); swap(line2[4], line2[0]); swap(line2[5], line3[0]); break; } case 3: { swap(line3[6], line1[0]); swap(line3[7], line2[0]); swap(line3[8], line3[0]); break; } } cout<<"-------------------------------------"<<endl <<"line1:"; Orderless_Out(line1, 9); //无序输出line1 cout<<"line2:"; Orderless_Out(line2, 9); //无序输出line2 cout<<"line3:"; Orderless_Out(line3, 9); //无序输出line3 cout<<"-------------------------------------"<<endl <<"What line the card you remenbered reside in now (1/2/3): "; cin>>c; while (c<1||c>3) { cout<<"Sorry, your importation contain mistake, please reinput: "; cin>>c; } //用户所输入的行数的第一张牌即用户一开始就“暗记”的牌 if (c==1) cout<<"Your remenber card is: "<<line1[0]<<endl; else if (c==2) cout<<"Your remenber card is: "<<line2[0]<<endl; else cout<<"Your remenber card is: "<<line3[0]<<endl; } ---------------------------------------------------------------------------------------------------------------------- 其余函数请查看头文件OutWay.h ---------------------------------------------------------------------------------------------------------------------- 4.4 调试分析: 本程序是一个比较有意思的程序,在调试的过程,确认结果比较容易,但要想完全检测程序是否有误,还是比较繁的。不过整个程序调试下来,还是挺好玩的,看到自己心里“暗记”的牌最后可以被计算机找出来。不过我的程序还有很大的改进空间,如将switch语句进行调整,或合并成一个大循环等。 4.5 用户使用说明: 在程序运行后需要用户根据程序的提示,在抽出的27张牌“暗记”一张牌,然后3次回答程序“暗记”的那张牌的行数,程序便能够自动将用户所“暗记”的牌显示出来。 4.6 设计心得: 这一是这么多最有意思的一道,向变魔术一般,将用户“暗记”的牌展示出来。整个程序还是比较复杂的,特别是我在设计输出函数时,无序排列确实让我费了一番周折。而且在这3个switch语句的case语句的交换也是比较容易弄混的,我就在编程序是忘了在case语句后加上break而导致程序一直调试不成功,好不容易才改正过来。 5基础_13. 找出整数的前第n位和后第n位 5.1 需求分析: 本主要是要求设计具有如下原型的函数:int f(unsigned long x, int n, int& Lxn); 它负责将整数x的第n位(从左边数第n位,n>0)的数值放到引用Lxn之(将作为结果返回到主调函数的对应实参变量),并将倒数第n位(从右边数第n位,n>0)的数值作为函数结果返回去。并编制主函数对它进行调用以验证其正确性。 ///////////////////////////////////////////// 程序执行的结果://///////////////////////////////////////////////// 5.2 概要设计: 在对目理解的基础上,以及所给出的要求,我认为此问有以下两个重点: 1)将用户输入的这个长整型的数按位存储在一个数组里; 2)通过循环输出这个数组的第n-1项和倒数第n-1项。 /////////////////////////////////////////////////// 程序流程图: 5.3 详细设计与编码: 当x=123456789,n=7时,执行语句“Rxn=f(x, n, Lxn);”将使返回的Lxn为7,并使Rxn变为3;而执行语句“Rxn=f(12345, 6, Lxn);”将使Lxn与Rxn都变为为0(超出数的“长度”即总位数时返回0)。 /////////////////////////////////////////////////// 具体源程序如下: ---------------------------------------------------------------------------------------------------------------------- int f(unsigned long x, int n, int&Lxn) {//目所要求的函数f int N=1; //用来记录无符长整数x的位数 unsigned long IM=x/10; while (IM!=0) { IM=IM/10; N++; } if (n>N) {//用来判断n是否超出x的长度 Lxn=0; return 0; } int *p=new int[N+1]; //用来存放x的每一位数 for (int i=N; i>0; i--) {//将x的每一位数字倒序的输入到数组p int j=pow(10,(N-i+1)); p[i]=(x%j-x%(j/10))/(j/10); } Lxn=p[n]; //返回引用Lxn的值 return p[N-n+1]; //函数返回的值 } ---------------------------------------------------------------------------------------------------------------------- main()函数见test_Main .cpp ---------------------------------------------------------------------------------------------------------------------- 5.4 调试分析: 本程序在调试的过程,可能会遇到由于长整型数位数的限制,用户如果输入的x太大的话便会产生程序的溢出错误,造成程序进入死循环。所以在输入时,x的大小因有所限制。 5.5 用户使用说明: 在程序运行后需要用户根据程序的提示输入一个长整型的x,在输入要显示的位数n即可让程序将x的第n位和从后数第n位显示出来。 5.6 设计心得: 这道重点便是怎样将用户输入的长整型数分位存储,当然,我们也可以选用getchar()的方式,但我个人认为还是使用数组来通过取余的方式将x的每一位村与数组比较好。 在完成程序后,调试是发现了很多的错误,其取余的地方就一直通不过,在反复调试后才最终将程序改好。通过这次编程使我懂得即使是非常有把握的程序,如果不细心的话,一样会碰钉子。 6基础_14.整数组前n项是否按降序排列 6.1 需求分析: 本主要是要求编出两种算法,一种递归一种非递归两种函数f,负责判断数组a的前n个元素是否从大到小完全有序了,是则返回true,否则返回false。 ///////////////////////////////////////////// 程序执行的结果://///////////////////////////////////////////////// 6.2 概要设计: 1)非递归函数只需逐对地判断各a[i] 与a[i+1]是否都已从大到小有序排列(i = 0,1,…,n-2)。 2)递归函数将问分解处理为:若n=1(即只有1个元素时)则返回true而递归出口;n>1时,若最后一对元素不顺序则返回false,否则进行递归调用(传去实参a与 n-1,去判断前n-1个元素的顺序性),并返回递归调用的结果(与前n-1个元素的是否顺序性相同)。 /////////////////////////////////////////////////// 程序流程图:
# 国家集训队论文列表(1999-2019) ___点击目录快速跳转:___ - _国家集训队论文列表(1999-2019)_ * [_1999_](#1999) * [_2000_](#2000) * [_2001_](#2001) * [_2002_](#2002) * [_2003_](#2003) * [_2004_](#2004) * [_2005_](#2005) * [_2006_](#2006) * [_2007_](#2007) * [_2008_](#2008) * [_2009_](#2009) * _2010~2012:组委会暂停论文答辩项目_ * [_2013_](#2013) * [_2014_](#2014) * [_2015_](#2015) * [_2016_](#2016) * [_2017_](#2017) * [_2018_](#2018) * [_2019_](#2019) - _论文分类汇总(1999-2009)_ * [组合数学](#组合数学) + [计数与统计](#计数与统计) + [数位问](#数位问) + [动态统计](#动态统计) + [博弈](#博弈) + [母函数](#母函数) + [拟阵](#拟阵) + [线性规划](#线性规划) + [置换群](#置换群) + [问答交互](#问答交互) + [猜数问](#猜数问) * [数据结构](#数据结构) + [数据结构](#数据结构-1) + [结构联合](#结构联合) + [块状链表](#块状链表) + [动态树](#动态树) + [左偏树](#左偏树) + [跳表](#跳表) + [SBT](#sbt) + [线段树](#线段树) + [单调队列](#单调队列) + [哈希表](#哈希表) + [Splay](#splay) * [图论](#图论) + [图论](#图论-1) + [模型建立](#模型建立) + [网络流](#网络流) + [最短路](#最短路) + [欧拉路](#欧拉路) + [差分约束系统](#差分约束系统) + [平面图](#平面图) + [2-SAT](#2-sat) + [最小生成树](#最小生成树) + [二分图](#二分图) + [Voronoi图](#voronoi图) + [偶图](#偶图) * [树](#树) + [树](#树-1) + [路径问](#路径问) + [最近公共祖先](#最近公共祖先) + [划分问](#划分问) * [数论](#数论) + [欧几里得算法](#欧几里得算法) + [同余方程](#同余方程) * [搜索](#搜索) + [搜索](#搜索-1) + [启发式](#启发式) + [优化](#优化) * [背包问](#背包问) * [匹配](#匹配) * [概率](#概率) + [概率](#概率-1) + [数学期望](#数学期望) * [字符串](#字符串) + [字符串](#字符串-1) + [多串匹配](#多串匹配) + [后缀数组](#后缀数组) + [字符串匹配](#字符串匹配) * [动态规划](#动态规划) + [动态规划](#动态规划-1) + [状态压缩](#状态压缩) + [状态设计](#状态设计) + [树形DP](#树形dp) + [优化](#优化-1) * [计算几何](#计算几何) + [立体几何](#立体几何) + [计算几何思想](#计算几何思想) + [圆](#圆) + [半平面交](#半平面交) * [矩阵](#矩阵) + [矩阵](#矩阵-1) + [高斯消元](#高斯消元) * [数学方法](#数学方法) + [数学思想](#数学思想) + [数学归纳法](#数学归纳法) + [多项式](#多项式) + [数形结合](#数形结合) + [黄金分割](#黄金分割) * [其他算法](#其他算法) + [遗传算法](#遗传算法) + [信息论](#信息论) + [染色与构造](#染色与构造) * [一类问](#一类问) + [区间](#区间) + [序](#序) + [系](#系) + [物理问](#物理问) + [编码与译码](#编码与译码) + [对策问](#对策问) * [优化](#优化-2) + [算法优化](#算法优化) + [程序优化](#程序优化) + [语言](#语言) * [策略](#策略) + [策略](#策略-1) + [倍增](#倍增) + [二分](#二分) + [调整](#调整) + [随机化](#随机化) + [非完美算法](#非完美算法) + [提交答案](#提交答案) + [守恒思想](#守恒思想) + [极限法](#极限法) + [贪心](#贪心) + [压缩法](#压缩法) + [逆向思维](#逆向思维) + [穷举](#穷举) + [目标转换](#目标转换) + [类比](#类比) + [分割与合并](#分割与合并) + [平衡思想](#平衡思想) Table of contents generated with markdown-toc --- ## 1999 陈 宏 -《数据结构的选择与算法效率——从IOI98试PICTURE谈起》 来煜坤 -《把握本质,灵活运用——动态规划的深入探讨》 齐 鑫 -《搜索方法的剪枝优化》 邵 铮 -《数学模型的建立、比较和应用》 石润婷 -《隐蔽化、多维化、开放化──论当今信息学竞赛数学建模的灵活性》 杨 帆 -《准确性、全面性、美观性——测试数据设计的三要素》 周咏基 -《论随机化算法的原理与设计》 ## 2000 陈 彧 《信息学竞赛的思维方法》 方 奇 《动态规划》 高寒蕊 -《递推关系的建立及在信息学竞赛的应用》 郭 一 -《数学模型及其在信息学竞赛的应用》 江 鹏 -《探索构造法解题模式》 李 刚 -《动态规划的深入讨论》 龙 翀 -《解决空间规模问的几种常用的存储结构》 骆 骥 -《数学模型的建立和选择》 施 遥 -《人工智能在围棋程序的应用》 肖 洲 -《数据结构的在程序设计的应用》 谢 婧 -《规模化问解题策略》 徐 串 -《论程序的调试技巧》 徐 静 -《图论模型的建立与转化》 杨江明 -《论数学策略在信息学问的应用》 杨 培 -《非最优化算法初探》 张 辰 -《动态规划的特点及其应用》 张 力 -《类比思想在解题的应用》 张一飞 -《冗繁削尽留清瘦——浅谈信息的充分利用》 ## 2001 高寒蕊 -《从圆桌问谈数据结构的综合运用》 符文杰 -《Pólya原理及其应用》 高 岳 -《等硬度解题报告》 江 鹏 -《从一道目的解法试谈网络流的构造与算法》 刘汝佳 -《搬运工问的启示》 李益明 -《计算几何的相关问》 李 源 -《树的枚举》 骆 骥 -《由"汽车问"浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青 -《动态规划算法的优化技巧》 俞 玮 -《基本动态规划问的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退一步海阔天空——"目标转化思想"的若干应用》 方 奇 -《浅谈必要条件的应用》 符文杰 -《排序网络》 何江舟 -《用高斯消元法解线性方程组》 何 林 -《猜想及其应用》 黄 芸 -《POI0110 跳舞蝇》 金 恺 -《浅谈网络流算法的应用》 李澎煦 -《半平面交的算法及其应用》 李 睿 -《二分法与统计问》 骆 骥 -《浅析解 "对策问" 的两种思路——从《取石子》问谈起》 孙方成 -《偶图的算法及应用》 孙林春 -《让我们做得更好——从《Parity》的解法谈程序的优化》 王知昆 -《搜索顺序的选择》 许智磊 -《二分,再二分!――从Mobiles(IOI 2001)一看多重二分》 杨旻旻 -《构造法——解题的最短路径》 张家琳 -《多项式乘法》 张 宁 -《遗传算法的特点及其应用》 张一飞 -《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 周文超 -《树结构在程序设计的运用》 ## 2003 方 奇 -《染色法和构造法在棋盘上的应用》 高正宇 -《答案只有一个——浅谈问答式交互问》 何 林 -《一类称球问的解法》 侯启明 -《信息论在信息学竞赛的简单应用》 姜尚仆 -《模线性方程的应用——用数论方法解决整数问》 金 恺 -《探寻深度优先搜索的优化技巧——从正方形剖分问谈起》 雷环 -《结果提交类问》 林希德 -《求最大重复子串》 刘才良 -《平面图在信息学的应用》 刘一鸣 -《一类搜索的优化思想——数据有序化》 陆可昱 -《长方体体积并》 饶向荣 -《病毒的DNA——剖析一道字符匹配问解析过程》 邵烜程 -《数学思想助你一臂之力》 王知昆 -《浅谈用极大化思想解决最大子矩形问》 伍 昱 -《由对称性解2-SAT问》 项荣璟 -《充分利用问性质——例析动态规划的"个性化"优化》 许智磊 -《浅谈补集转化思想在统计问的应用》 张 宁 -《猜数问的研究》 张云亮 -《论对算法的选择》 周 源 -《浅析"最小表示法"思想在字符串循环同构问的应用》 ## 2004 何 林 -《信息学守恒法的应用》 胡伟栋 -《减少冗余与算法优化》 金 恺 -《极限法——解决几何最优化问的捷径》 李锐喆 -《细节——不可忽视的要素》 鬲 融 -《浅谈特殊穷举思想的应用》 周 源 -《浅谈数形结合思想在信息学竞赛的应用》 朱晨光 -《优化,再优化!》 肖 天 -《"分层图思想"及其在信息学竞赛的应用》 汪 汀 -《最小生成树问的拓展》 吴景岳 -《最小生成树算法及其应用》 栗 师 -《转化目标在解题的应用》 薛 矛 -《解决动态统计问的两把利刃》 黄源河 -《浅谈图论模型的建立与应用》 楼天城 -《匹配算法在搜索问的应用》 贝小辉 -《浅析树的划分问》 林 涛 -《线段树的应用》 杨思雨 -《伸展树的基本操作与应用》 许智磊 -《后缀数组》 朱泽园 -《多串匹配算法及其启示》 韩文弢 -《论C++语言在信息学竞赛的应用》 ## 2005 龙 凡 -《序的应用》 魏 冉 -《浅谈“跳跃表”的相关操作及其应用》 任 恺 -《图论的基本思想及方法》 杨 俊 -《二分策略在信息学竞赛的应用》 张伟达 -《用改进算法的思想解决规模维数增大的问》 黄 刚 -《数据结构的联合》 杨 弋 -《从“小H的小屋”的解法谈算法的优化》 朱晨光 -《浅析倍增思想在信息学竞赛的应用》 李羽修 -《Hash函数的设计优化》 王 俊 -《浅析二分图匹配在信息学竞赛的应用》 唐文斌 -《正难则反——浅谈逆向思维在解题的应用》 黄源河 -《左偏树的特点及其应用》 钱自强 -《遗传算法应用的分析与研究》 杨思雨 -《浅谈“黄金分割”和信息学的联系》 潘震皓 -《置换群快速幂运算研究与探讨》 胡伟栋 -《非完美算法在信息学竞赛的应用》 何 林 -《数据关系的简化》 汪 汀 -《参数搜索的应用》 周 源 -《浅谈信息学竞赛的“压缩法”》 朱泽园 -《回到起点 ----《一种突破性思维》 ## 2006 陈启峰 -《“约制、放宽”方法在解题的应用》 陈首元 -《维护森林连通性——动态树》 冯 威 -《数与图的完美结合——浅析差分约束系统》 高逸涵 -《对于一道目的深入分析》 胡伟栋 -《演讲的若干建议》 黄劲松 -《贪婪的动态规划》 黄晓愉 -《深度优先搜索问的优化技巧》 贾 由 -《由图论算法浅析算法优化》 李天翼 -《从特殊情况考虑》 龙 凡 -《一类猜数问的研究》 汤 泽 -《浅析队列在一类单调性问的应用》 唐文斌 -《“调整”思想在信息学的应用》 汪 晔 -《信息学的参考系与坐标系》 王 栋 -《浅析平面Voronoi图的构造及应用》 王 赟 -《Trie图的构建、活用与改进》 余远铭 -《最短路算法及其应用》 俞 鑫 -《棋盘的棋盘——浅谈棋盘的分割思想》 周戈林 -《浅谈类比思想》 周以苏 -《论反汇编在时间常数优化的应用》 朱晨光 -《基本数据结构在信息学竞赛的应用》 朱泽园 -《半平面交的新算法及其实用价值》 ## 2007 高逸涵 -《与圆有关的离散化》 王晓珂 -《解析一类组合游戏》 仇荣琦 -《欧拉回路性质与应用探究》 余江伟 -《如何解决动态统计问》 杨 沐 -《浅析信息学的“分”与“合”》 李宇骞 -《浅谈信息学竞赛的线性规划——简洁高效的单纯形法实现与应用》 袁昕颢 -《动态树及其应用》 杨 哲 -《凸完全单调性的加强与应用》 王欣上 -《浅谈基于分层思想的网络流算法》 陈启峰 -《Size Balanced Tree》 杨 弋 -《Hash在信息学竞赛的一类应用》 古 楠 -《平面嵌入》 郭华阳 -《RMQ与LCA问》 刘雨辰 -《对拟阵的初步研究》 陈 雪 -《问的变与不变》 何 森 -《浅谈数据的合理组织》 胡伯涛 -《最小割模型在信息学竞赛的应用》 陈瑜希 -《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》 周 冬 -《生成树的计数及其应用》 刘家骅 -《浅谈随机化在信息学竞赛的应用》 ## 2008 曹钦翔 -《数据结构的提炼与压缩》 郑 暾 -《平衡规划——浅析一类平衡思想的应用》 刘 弈 -《浅谈信息学状态的合理设计与应用》 顾 研 -《浅谈随机化思想在几何问的应用》 周梦宇 -《码之道——浅谈信息学竞赛的编码与译码问》 肖汉骏 -《例谈信息学竞赛分析的“深”与“广”》 方 戈 -《浅析信息学竞赛一类与物理有关的问》 吕子鉷 -《浅谈最短径路问的分层思想》 周小博 -《浅谈信息学竞赛的区间问》 俞华程 -《矩阵乘法在信息学的应用》 程芃祺 -《计算几何的二分思想》 高逸涵 -《部分贪心思想在信息学竞赛的应用》 **陈丹琦 -《基于连通性状态压缩的动态规划问》** 张煜承 -《一类算法复合的方法》 陈瑜希 -《Pólya计数法的应用》 余林韵 -《运用化归思想解决信息学的数列问》 任一恒 -《非完美算法初探》 高亦陶 -《从立体几何问看降低编程复杂度》 **苏 煜 -《对块状链表的一点研究》** 周 冬 -《两极相通——浅析最大—最小定理在信息学竞赛的应用》 ## 2009 武 森 -《浅谈信息学竞赛的“0”和“1”》 **贾志豪 -《组合游戏略述——浅谈SG游戏的若干拓展及变形》** 徐持衡 -《浅谈几类背包》 骆可强 -《论程序底层优化的一些方法与技巧》 刘 聪 -《浅谈数位类统计问》 **李骥扬 -《线段跳表——跳表的一个拓展》** 汤可因 -《浅析竞赛一类数学期望问的解决方法》 徐源盛 -《对一类动态规划问的研究》 张昆玮 -《数学归纳法与解题之道》 漆子超 -《分治算法在树的路径问的应用》 罗穗骞 -《后缀数组——处理字符串的有力工具》 **方展鹏 -《浅谈如何解决不平等博弈问》** 姜碧野 -《SPFA算法的优化及应用》 **毛杰明 -《母函数的性质及应用》** 董华星 -《浅析字母树在信息学竞赛的应用》 梅诗珂 -《信息学竞赛概率问求解初探》 高逸涵 -《数位计数问解法研究》 周而进 -《浅谈估价函数在信息学竞赛的应用》 金 斌 -《欧几里得算法的应用》 曹钦翔 -《从“k倍动态减法游戏”出发探究一类组合游戏问》 ## 2010~2012:组委会暂停论文答辩项目 ## 2013 彭天翼 -《登顶计划》 王康宁 -《方格取数》 罗 干 -《Two strings 试讨论》 张闻涛 -《Catch The Penguins》 罗剑桥 -《浅谈分块思想在一类数据处理问的应用》 乔明达 -《搜索问的meet in the middle技巧》 胡渊鸣 -《浅析信息学竞赛概率论的基础与应用》 许昊然 -《浅谈数据结构的几个非经典解法》 陈立杰 -《重量平衡树和后缀平衡树在信息学奥赛的应用》 高胜寒 -《浅谈环状计数问》 王子昱 -《分块方法的应用》 王 迪 -《浅谈容斥原理》 ## 2014 王子昱 -《MSS 命报告》 余行江 -《矩阵 命报告》 董宏华 -《多变的多边形》 岑若虚 -《对置换群有关算法初步研究》 匡正非 -《浅谈线性相关》 张恒捷 -《关于三维最小乘积生成树的一些研究》 徐 毅 -《浅谈回文子串问》 梁泽宇 - 《浅谈维护多维数组的方法在数据结构的应用》 **王悦同 -《根号算法——不只是分块》** **黄志翱 -《浅谈动态树的相关问及简单拓展》** **胡泽聪 -《随机化算法在信息学竞赛的应用》** **何 琦 -《精细地实现程序——浅谈OI竞赛的常数优化》** **沈 洋 -《回归本源——位运算及其应用》** **俞鼎力 -《寻找第 k 优解的几种方法》** ## 2015 刘研绎 -《后缀自动机在字典树上的拓展》 **任之洲 -《浅谈启发式思想在信息学竞赛的应用》** 王鉴浩 -《浅谈字符串匹配的几种方法》 张天扬 -《后缀自动机及其应用》 金 策 -《生成函数的运算与组合计数问》 刘剑成 -《YDC的奖金命报告》 邹逍遥 -《浅谈分块在一类在线问的应用》 王逸松 -《仙人掌相关算法及其应用》 陈胤伯 -《浅谈图的匹配算法及其应用》 陈思禹 -《浅谈信息学竞赛的物理问》 于纪平 -《丢失的面命报告》 张恒捷 -《DP的一些优化技巧》 杜瑜皓 -《Product命报告》 卢啸尘 -《关于以源代码为输入的一类问初步探索》 吕凯风 -《集合幂级数的性质与应用及其快速算法》 ## 2016 **任之洲 -《积性函数求和的几种方法》** **姜志豪 -《网络流的一些建模方法》** 董克凡 -《浅谈线性规划与对偶问》 王文涛 -《浅谈无向图最小割问的一些算法及应用》 邹逍遥 -《浅谈线性规划在信息学竞赛的应用》 **吉如一 -《区间最值操作与历史最值问》** **毛 啸 -《再探快速傅里叶变换》** **罗哲正 -《从Unknown谈一类支持末尾插入删除的区间信息维护方法》** 洪华敦 -《小C的后缀数组命报告》 张浩威 -《消消看 命报告》 李子豪 -《《strakf》命报告》 汪文潇 -《《过去的集合》命报告》 **吴作凡 -《火车司机出秦川 命报告》** 金 策 -《基础排序算法练习》 袁宇韬 -《move命报告》 ## 2017 毛 啸 -《关于数列递归式的一些研究》 **杨家齐 -《基于线性代数的一般图匹配》** 袁宇韬 -《多项式求和》 **钟知闲 -《浅谈信息学竞赛的独立集问》** 陈俊锟 -《“神奇的子图”命报告及其拓展》 孙耀峰 -《动态传递闭包问的探究》 汪乐平 -《“A+B Problem”命报告》 **徐明宽 -《非常规大小分块算法初探》** 翁文涛 -《回文树及其应用》 闫书弈 -《“黑白树”命报告》 杨景钦 -《“正多边形”命报告》 冯 哲 -《浅谈决策单调性动态规划的线性解法》 沈 睿 -《“被操纵的线段树”命报告》 赵晟宇 -《计算机逻辑与艺术初探——基于逻辑的钢琴演奏音符力度模型》 洪华敦 -《“基因组重构”命报告》 ## 2018 杨懋龙 - 《浅谈生成函数在掷骰子问上的应用》 陈江伦 - 《“后缀树结点数”命报告及一类区间问的优化》 高睿泉 - 《浅谈保序回归问》 吴瑾昭 - 《“Fim 4”命报告》 任轩笛 - 《解决树上连通块问的一些技巧和工具》 梁晏成 - 《“Jellyfish”命报告及拓展探究》 王思齐 - 《LeafyTree及其实现的加权平衡树》 陈嘉乐 - 《“小H爱染色”命报告》 朱震霆 - 《一些特殊的数论函数求和问》 刘承奥 - 《浅谈DFT在信息学竞赛的应用》 林旭恒 - 《“完美的队列”命报告》 杨乾澜 - 《浅谈拟阵的一些拓展及其应用》 董炜隽 - 《浅谈Splay与Treap的性质及其应用》 何天 - 《“最小方差生成树”命报告》 陈 通 - 《欧拉图相关的生成与计数问探究》 ## 2019 钟子谦 - 《两类递推数列的性质和应用》 王修涵 - 《浅谈图模型上的随机游走问》 杨骏昭 - 《“小水”命报告》 高嘉煊 - 《浅谈图的点着色问》 戴 言 - 《浅谈格路计数相关问》 李佳衡 - 《算法竞赛一些数论问的推广与高斯整数初探》 范致远 - 《“基础圆方树练习”命报告》 徐翊轩 - 《“整点计数”命报告以及对高斯整数的若干研究》 张哲宇 - 《浅谈树上分治算法》 吴思扬 - 《“组合数求和”命报告》 王思齐 - 《浅谈一类简洁数据结构》 陈孙立 - 《子串周期查询问的相关算法及其应用》 吴作同 - 《“公园”命报告》 孔朝哲 - 《浅谈可追溯化数据结构》 袁方舟 - 《浅谈杨氏矩阵在信息学竞赛的应用》 ## 推荐文章 许智磊 -《后缀数组》 罗穗骞 -《后缀数组——处理字符串的有力工具》 朱泽园 -《半平面交的新算法及其实用价值》 胡伯涛 -《最小割模型在信息学竞赛的应用》 方展鹏 -《浅谈如何解决不平等博弈问》 陈丹琦 -《基于连通性状态压缩的动态规划问》 贾志豪 -《组合游戏略述——浅谈SG游戏的若干拓展及变形》 武 森 -《浅谈信息学竞赛的“0”和“1”》 李骥扬 -《线段跳表——跳表的一个拓展》 周 源 -《浅析"最小表示法"思想在字符串循环同构问的应用》 高逸涵 -《数位计数问解法研究》 张昆玮 -《数学归纳法与解题之道》 漆子超 -《分治算法在树的路径问的应用》 俞华程 -《矩阵乘法在信息学的应用》 陈瑜希 -《Pólya计数法的应用》 # 论文分类汇总(1999-2009) ## 组合数学 ### 计数与统计 2001 - 符文杰:《Pólya原理及其应用》 2003 - 许智磊:《浅谈补集转化思想在统计问的应用》 2007 - 周冬:《生成树的计数及其应用》 2008 - 陈瑜希《Pólya计数法的应用》 ### 数位问 2009 - 高逸涵《数位计数问解法研究》 2009 - 刘聪《浅谈数位类统计问》 ### 动态统计 2004 - 薛矛:《解决动态统计问的两把利刃》 2007 - 余江伟:《如何解决动态统计问》 ### 博弈 2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 2007 - 王晓珂:《解析一类组合游戏》 2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问》 2009 - 方展鹏《浅谈如何解决不平等博弈问》 2009 - 贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》 ### 母函数 2009 - 毛杰明《母函数的性质及应用》 ### 拟阵 2007 - 刘雨辰:《对拟阵的初步研究》 ### 线性规划 2007 - 李宇骞:《浅谈信息学竞赛的线性规划——简洁高效的单纯形法实现与应用》 ### 置换群 2005 - 潘震皓:《置换群快速幂运算研究与探讨》 ### 问答交互 2003 - 高正宇:《答案只有一个——浅谈问答式交互问》 ### 猜数问 2003 - 张宁:《猜数问的研究:一的推广》 2006 - 龙凡:《一类猜数问的研究》 ## 数据结构 ### 数据结构 2005 - 何林:《数据关系的简化》 2006 - 朱晨光:《基本数据结构在信息学竞赛的应用》 2007 - 何森:《浅谈数据的合理组织》 2008 - 曹钦翔《数据结构的提炼与压缩》 ### 结构联合 2001 - 高寒蕊:《从圆桌问谈数据结构的综合运用》 2005 - 黄刚:《数据结构的联合》 ### 块状链表 2005 - 蒋炎岩:《数据结构的联合——块状链表》 2008 - 苏煜《对块状链表的一点研究》 ### 动态树 2006 - 陈首元:《维护森林连通性——动态树》 2007 - 袁昕颢:《动态树及其应用》 ### 左偏树 2005 - 黄源河:《左偏树的特点及其应用》 ### 跳表 2005 - 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》 2009 - 李骥扬《线段跳表——跳表的一个拓展》 ### SBT 2007 - 陈启峰:《Size Balance Tree》 ### 线段树 2004 - 林涛:《线段树的应用》 ### 单调队列 2006 - 汤泽:《浅析队列在一类单调性问的应用》 ### 哈希表 2005 - 李羽修:《Hash函数的设计优化》 2007 - 杨弋:《Hash在信息学竞赛的一类应用》 ### Splay 2004 - 杨思雨:《伸展树的基本操作与应用》 ## 图论 ### 图论 2005 - 任恺:《图论的基本思想及方法》 ### 模型建立 2004 - 黄源河:《浅谈图论模型的建立与应用》 2004 - 肖天:《“分层图思想”及其在信息学竞赛的应用》 ### 网络流 2001 - 江鹏:《从一道目的解法试谈网络流的构造与算法》 2002 - 金恺:《浅谈网络流算法的应用》 2007 - 胡伯涛:《最小割模型在信息学竞赛的应用》 2007 - 王欣上:《浅谈基于分层思想的网络流算法》 2008 - 周冬《两极相通——浅析最大—最小定理在信息学竞赛的应用》 ### 最短路 2006 - 余远铭:《最短路算法及其应用》 2008 - 吕子鉷《浅谈最短径路问的分层思想》 2009 - 姜碧野《SPFA算法的优化及应用》 ### 欧拉路 2007 - 仇荣琦:《欧拉回路性质与应用探究》 ### 差分约束系统 2006 - 冯威:《数与图的完美结合——浅析差分约束系统》 ### 平面图 2003 - 刘才良:《平面图在信息学的应用》 2007 - 古楠:《平面嵌入》 ### 2-SAT 2003 - 伍昱:《由对称性解2-SAT问》 ### 最小生成树 2004 - 吴景岳:《最小生成树算法及其应用》 2004 - 汪汀:《最小生成树问的拓展》 ### 二分图 2005 - 王俊:《浅析二分图匹配在信息学竞赛的应用》 ### Voronoi图 2006 - 王栋:《浅析平面Voronoi图的构造及应用》 ### 偶图 2002 - 孙方成:《偶图的算法及应用》 ## 树 ### 树 2002 - 周文超:《树结构在程序设计的运用》 2005 - 栗师:《树的乐园——一些与树有关的目》 ### 路径问 2009 - 漆子超《分治算法在树的路径问的应用》 ### 最近公共祖先 2007 - 郭华阳:《RMQ与LCA问》 ### 划分问 2004 - 贝小辉:《浅析树的划分问》 ## 数论 ### 欧几里得算法 2009 - 金斌《欧几里得算法的应用》 ### 同余方程 2003 - 姜尚仆:《模线性方程的应用——用数论方法解决整数问》 ## 搜索 ### 搜索 2001 - 骆骥:《由“汽车问”浅谈深度搜索的一个方面——搜索对象与策略的重要性》 2002 - 王知昆:《搜索顺序的选择》 2005 - 汪汀:《参数搜索的应用》 ### 启发式 2009 - 周而进《浅谈估价函数在信息学竞赛的应用》 ### 优化 2003 - 金恺:《探寻深度优先搜索的优化技巧——从正方形剖分问谈起》 2003 - 刘一鸣:《一类搜索的优化思想——数据有序化》 2006 - 黄晓愉:《深度优先搜索问的优化技巧》 ## 背包问 2009 - 徐持衡《浅谈几类背包》 ## 匹配 2004 - 楼天城:《匹配算法在搜索问的巧用》 ## 概率 ### 概率 2009 - 梅诗珂《信息学竞赛概率问求解初探》 ### 数学期望 2009 - 汤可因《浅析竞赛一类数学期望问的解决方法》 ## 字符串 ### 字符串 2003 - 周源:《浅析“最小表示法”思想在字符串循环同构问的应用》 ### 多串匹配 2004 - 朱泽园:《多串匹配算法及其启示》 2006 - 王赟:《Trie图的构建、活用与改进》 2009 - 董华星《浅析字母树在信息学竞赛的应用》 ### 后缀数组 2004 - 许智磊:《后缀数组》 2009 - 罗穗骞《后缀数组——处理字符串的有力工具》 ### 字符串匹配 2003 - 饶向荣:《病毒的DNA———剖析一道字符匹配问解析过程》 2003 - 林希德:《求最大重复子串》 ## 动态规划 ### 动态规划 2001 - 俞玮:《基本动态规划问的扩展》 2006 - 黄劲松:《贪婪的动态规划》 2009 - 徐源盛《对一类动态规划问的研究》 ### 状态压缩 2008 - 陈丹琦《基于连通性状态压缩的动态规划问》 ### 状态设计 2008 - 刘弈《浅谈信息学状态的合理设计与应用》 ### 树形DP 2007 - 陈瑜希:《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》 ### 优化 2001 - 毛子青:《动态规划算法的优化技巧》 2003 - 项荣璟:《充分利用问性质——例析动态规划的“个性化”优化》 2004 - 朱晨光:《优化,再优化!——从《鹰蛋》一浅析对动态规划算法的优化》 2007 - 杨哲:《凸完全单调性的加强与应用》 ## 计算几何 ### 立体几何 2003 - 陆可昱:《长方体体积并》 2008 - 高亦陶《从立体几何问看降低编程复杂度》 ### 计算几何思想 2004 - 金恺:《极限法——解决几何最优化问的捷径》 2008 - 程芃祺《计算几何的二分思想》 2008 - 顾研《浅谈随机化思想在几何问的应用》 ### 圆 2007 - 高逸涵:《与圆有关的离散化》 ### 半平面交 2002 - 李澎煦:《半平面交的算法及其应用》 2006 - 朱泽园:《半平面交的新算法及其实用价值》 ## 矩阵 ### 矩阵 2008 - 俞华程《矩阵乘法在信息学的应用》 ### 高斯消元 2002 - 何江舟:《用高斯消元法解线性方程组》 ## 数学方法 ### 数学思想 2002 - 何林:《猜想及其应用》 2003 - 邵烜程:《数学思想助你一臂之力》 ### 数学归纳法 2009 - 张昆玮《数学归纳法与解题之道》 ### 多项式 2002 - 张家琳:《多项式乘法》 ### 数形结合 2004 - 周源:《浅谈数形结合思想在信息学竞赛的应用》 ### 黄金分割 2005 - 杨思雨:《美,无处不在——浅谈“黄金分割”和信息学的联系》 ## 其他算法 ### 遗传算法 2002 - 张宁:《遗传算法的特点及其应用》 2005 - 钱自强:《关于遗传算法应用的分析与研究》 ### 信息论 2003 - 侯启明:《信息论在信息学竞赛的简单应用》 ### 染色与构造 2002 - 杨旻旻:《构造法——解题的最短路径》 2003 - 方奇:《染色法和构造法在棋盘上的应用》 ## 一类问 ### 区间 2008 - 周小博《浅谈信息学竞赛的区间问》 ### 序 2005 - 龙凡:《序的应用》 ### 系 2006 - 汪晔:《信息学的参考系与坐标系》 ### 物理问 2008 - 方戈《浅析信息学竞赛一类与物理有关的问》 ### 编码与译码 2008 - 周梦宇《码之道—浅谈信息学竞赛的编码与译码问》 ### 对策问 2002 - 骆骥:《浅析解“对策问”的两种思路》 ## 优化 ### 算法优化 2002 - 孙林春:《让我们做得更好——从解法谈程序优化》 2004 - 胡伟栋:《减少冗余与算法优化》 2005 - 杨弋:《从的解法谈算法的优化》 2006 - 贾由:《由图论算法浅析算法优化》 ### 程序优化 2006 - 周以苏:《论反汇编在时间常数优化的应用》 2009 - 骆可强《论程序底层优化的一些方法与技巧》 ### 语言 C++ 2004 - 韩文弢:《论C++语言在信息学竞赛的应用》 ## 策略 ### 策略 2004 - 李锐喆:《细节——不可忽视的要素》 2005 - 朱泽园:《回到起点——一种突破性思维》 2006 - 陈启峰:《“约制、放宽”方法在解题的应用》 2006 - 李天翼:《从特殊情况考虑》 2007 - 陈雪:《问的变与不变》 2008 - 肖汉骏《例谈信息学竞赛分析的“深”与“广”》 ### 倍增 2005 - 朱晨光:《浅析倍增思想在信息学竞赛的应用》 ### 二分 2002 - 李睿:《二分法与统计问》 2002 - 许智磊:《二分,再二分!——从Mobiles(IOI2001)一看多重二分》 2005 - 杨俊:《二分策略在信息学竞赛的应用》 ### 调整 2006 - 唐文斌:《“调整”思想在信息学的应用》 ### 随机化 2007 - 刘家骅:《浅谈随机化在信息学竞赛的应用》 ### 非完美算法 2005 - 胡伟栋:《浅析非完美算法在信息学竞赛的应用》 2008 - 任一恒《非完美算法初探》 ### 提交答案 2003 - 雷环:《结果提交类问》 ### 守恒思想 2004 - 何林:《信息学守恒法的应用》 ### 极限法 2003 - 王知昆:《浅谈用极大化思想解决最大子矩形问》 ### 贪心 2008 - 高逸涵《部分贪心思想在信息学竞赛的应用》 ### 压缩法 2005 - 周源:《压去冗余缩得精华——浅谈信息学竞赛的“压缩法”》 ### 逆向思维 2005 - 唐文斌:《正难则反——浅谈逆向思维在解题的应用》 ### 穷举 2004 - 鬲融:《浅谈特殊穷举思想的应用》 ### 目标转换 2002 - 戴德承:《退一步海阔天空——“目标转化思想”的若干应用》 2004 - 栗师:《转化目标在解题的应用》 ### 类比 2006 - 周戈林:《浅谈类比思想》 ### 分割与合并 2006 - 俞鑫:《棋盘的棋盘——浅谈棋盘的分割思想》 2007 - 杨沐:《浅析信息学的“分”与“合”》 ### 平衡思想 2008 - 郑暾《平衡规划——浅析一类平衡思想的应用》
包括C程序设计(第四版)的高清扫描版pdf以及与该书配套的学习辅导一书的pdf。 《C程序设计(第四版)》是由谭浩强教授著、清华大学出版社出版的《C程序设计》是一本公认的学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要,作者在《C程序设计(第三版)》的基础上进行了修订。本书按照C语言的新标准C 99进行介绍,所有程序都符合C 99的规定,使编写程序更加规范;对C语言和程序设计的基本概念和要点讲解透彻,全面而深入;按照作者提出的“提出问—解决问—归纳分析”三部曲进行教学、组织教材;本书的每个例都按以下几个步骤展开:提出任务—解题思路—编写程序—运行程序—程序分析—有关说明。符合读者认知规律,容易入门与提高。 本书内容先进,体系合理,概念清晰,讲解详尽,降低台阶,分散难点,例丰富,深入浅出,文字流畅,通俗易懂,是初学者学习C程序设计的理想教材,可作为高等学校各专业的正式教材,也是一本自学的好教材。本书还配有辅助教材《C程序设计(第四版)学习辅导》。 《C程序设计(第四版)学习辅导.pdf》共分4个部分 第1部分是《C程序设计(第四版)》一书的习和参考解答,包括了该书各章的全部习,对全部编程都给出了参考解答,共计132个程序; 第2部分是深入学习C程序设计,包括预处理指令、位运算和C程序案例; 第3部分是上机指南,详细介绍了Visual C++ 6.0集成环境下编辑、编译、调试和运行程序的方法; 第4部分是上机实验指导,包括程序的调试与测试、实验的目的与要求,并提供了本课程12个实验。 《C程序设计(第四版)》目录: 第1章 程序设计和C语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C语言的发展及其特点 1.4 最简单的C语言程序 1.4.1 最简单的C语言程序举例 1.4.2 C语言程序的结构 1.5 运行C程序的步骤与方法 1.6 程序设计的任务 习 第2章 算法——程序的灵魂 2.1 什么是算法 2.2 简单的算法举例 2.3 算法的特性 2.4 怎样表示一个算法 2.4.1 用自然语言表示算法 2.4.2 用流程图表示算法 2.4.3 三种基本结构和改进的流程图 2.4.4 用N?S流程图表示算法 2.4.5 用伪代码表示算法 2.4.6 用计算机语言表示算法 2.5 结构化程序设计方法 习 第3章 最简单的C程序设计——顺序程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.2.1 常量和变量 3.2.2 数据类型 3.2.3 整型数据 3.2.4 字符型数据 3.2.5 浮点型数据 3.2.6 怎样确定常量的类型 3.2.7 运算符和表达式 3.3 C语句 3.3.1 C语句的作用和分类 3.3.2 最基本的语句——赋值语句 3.4 数据的输入输出 3.4.1 输入输出举例 3.4.2 有关数据输入输出的概念 3.4.3 用printf函数输出数据 3.4.4 用scanf函数输入数据 3.4.5 字符数据的输入输出 习 第4章 选择结构程序设计 4.1 选择结构和条件判断 4.2 用if语句实现选择结构 4.2.1 用if语句处理选择结构举例 4.2.2 if语句的一般形式 4.3 关系运算符和关系表达式 4.3.1 关系运算符及其优先次序 4.3.2 关系表达式 4.4 逻辑运算符和逻辑表达式 4.4.1 逻辑运算符及其优先次序 4.4.2 逻辑表达式 4.4.3 逻辑型变量 4.5 条件运算符和条件表达式 4.6 选择结构的嵌套 4.7 用switch语句实现多分支选择结构 4.8 选择结构程序综合举例 习 第5章 循环结构程序设计 5.1 为什么需要循环控制 5.2 用while语句实现循环 5.3 用do…while语句实现循环 5.4 用for语句实现循环 5.5 循环的嵌套 5.6 几种循环的比较 5.7 改变循环执行的状态 5.7.1 用break语句提前终止循环 5.7.2 用continue语句提前结束本次循环 5.7.3 break语句和continue语句的区别 5.8 循环程序举例 习 第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组 6.1.1 怎样定义一维数组 6.1.2 怎样引用一维数组元素 6.1.3 一维数组的初始化 6.1.4 一维数组程序举例 6.2 怎样定义和引用二维数组 6.2.1 怎样定义二维数组 6.2.2 怎样引用二维数组的元素 6.2.3 二维数组的初始化 6.2.4 二维数组程序举例 6.3 字符数组 6.3.1 怎样定义字符数组 6.3.2 字符数组的初始化 6.3.3 怎样引用字符数组的元素 6.3.4 字符串和字符串结束标志 6.3.5 字符数组的输入输出 6.
一、选择(每1分,共30分) 下列各A)、B)、C)、D)四个选项,只有一个选项是正确的,请将正确选项的标记写在干后的括号内。 1.下列语句序列执行后,k 的值是( )。 int m=3, n=6, k=0; while( (m++) < ( -- n) ) ++k; A) 0 B) 1 C) 2 D) 3 2.设 i、j 为int型变量名,a 为int型数组名,以下选项,正确的赋值语句是( )。 A) i = i + 2 B) a[0] = 7; C) i++ - --j; D) a(0) = 66; 3.Java语言的类间的继承关系是( )。 A) 多重的 B) 单重的 C) 线程的 D) 不能继承 4.设有定义 int i = 6 ;,则执行以下语句后,i 的值为( )。 i += i - 1; A) 10 B) 121 C) 11 D) 100 5.下列选项,用于在定义子类时声明父类名的关键字是( )。 A)interface B) package C) extends D) class 6.若已定义 byte[ ] x= {11,22,33,-66} ; 其0≤k≤3,则对x数组元素错误的引用是( )。 A) x[5-3] B) x[k] C) x[k+5] D) x[0] 7.下列语句序列执行后,ch1 的值是( )。 char ch1='A',ch2='W'; if(ch1 + 2 < ch2 ) ++ch1; A) ‘A' B) ‘B' C) ‘C' D) B 8.下列语句序列执行后,i 的值是( )。 int i=8, j=16; if( i-1 > j ) i--; else j--; A) 15 B) 16 C) 7 D) 8 9.下列语句序列执行后,k 的值是( )。 int i=10, j=18, k=30; switch( j - i ) { case 8 : k++; case 9 : k+=2; case 10: k+=3; default : k/=j; } A) 31 B) 32 C) 2 D) 33 10.下面语句执行后,i 的值是( )。 for( int i=0, j=1; j < 5; j+=3 ) i=i+j; A) 4 B) 5 C) 6 D) 7 11.设有定义 float x=3.5f, y=4.6f, z=5.7f;则以下的表达式,值为true的是( )。 A) x > y || x > z B) x != y C) z > ( y + x ) D) x < y & ! ( x < z ) 12.下列语句序列执行后,i的值是( )。 int i=16; do { i/=2; } while( i > 3 ); A) 16 B) 8 C) 4 D) 2 13.以下由 for 语句构成的循环执行的次数是( )。 for ( int i = 0; true ; i++) ; A) 有语法错,不能执行 B) 无限次 C) 执行1次 D) 一次也不执行 14.定义类头时能使用的修饰符是( )。 A) private B) static C) abstract D) protected 15.设int 型变量 a、b,float 型变量 x、y,char 型变量 ch 均已正确定义并赋值, 正确的switch语句是( )。 A) switch (x + y) B) switch ( ch + 1 ) { ...... } { ...... } C) switch ch D) switch ( a + b ); { ...... } { ...... } 16. 下列最终属性 i 的定义,正确的是( )。 A) static final int i=100; B) final int i=1.2; C) final i='w'; D) final char i; 17. 下列类定义,不正确的是( )。 A) class x { .... } B) class x extends y { .... } C) static class x implements y1,y2 { .... } D) public class x extends Applet { .... } 18. 设 x、 y为已定义的类名,下列声明x类的对象x1的语句正确的是( )。 A) static x x1; B) public x x1=new x(int 123); C) y x1; D) x x1=x( ); 19. 设 i、j、k 为类 x 定义的 int 型变量名,下列类 x 的构造函数不正确的是( )。 A) x( int m){ ... } B) void x( int m){ ... } C) x( int m, int n){ ... } D) x( int h,int m,int n){ ... } 20. 下列方法定义,正确的是( )。 A) int x( ){ char ch='a'; return (int)ch; } B) void x( ){ ...return true; } C) int x( ){ ...return true; } D) int x( int a, b){ return a+b; } 21. 用于定义类成员的访问控制权的一组关键字是( )。 A) class, float, double, public B) float, boolean, int, long C) char, extends, float, double D) public, private, protected 22. 不能构成循环的语句是( )。 A) for 语句 B) while 语句 C) switch 语句 D) do__while 语句 23. 下列程序段执行后 b3 的结果是( )。 boolean b1=true, b2, b3; b3= b1 ? b1 : b2; A) 0 B) 1 C) true D) false 24. 下面数据结构,属于非线性的是( )。 A) 线性表 B) 树 C) 队列 D) 堆栈 25. 设有定义 int i=123; long j=456; 下面赋值不正确的语句是( )。 A) j=i; B) j=(long)i; C) i=(int)j; D) i=j; 26. 现有一整型数组a[4],它的所有数组元素是( )。 A) a0, a1, a2, a3 B) a[0], a[1], a[2], a[3] C) a[1], a[2], a[2], a[4] D) a[0], a[1], a[2], a[3], a[4] 27. 定义 Java Applet程序时,必须有的 import语句是( )。 A) import java.applet.Applet; B) import java.io.*; C) import java.awt.event; D) import java.lang.*; 28.现有两个类A、B,以下描述表示B继承自A的是( )。 A) class A extends B B) class B implements A C) class A implements B D) class B extends A 29. 下列算法,不能用来排序的算法是( )。 A) 冒泡法 B) 插入排序 C) 选择排序 D) 对分法 30. 堆栈操作的原则是( )。 A) 先进先出 B) 后进先出 C) 只能进 D) 只能出 二、填空(每空1分,共15分) 请将正确答案填写在答纸相应位置上,答在试卷上不得分。 1. 构造函数______有返回值。 2. Java语言的浮点型数据根据数据存储长度和数值精度的不同,进一步分为float和 __________两种具体类型。 3. 创建类对象的运算符是___________。 4. 当整型变量n的值不能被13除尽时,其值为 false 的Java语言表达式是_____________ 。 5. 在Java语言,所有的数组都有一个lenght属性,这个属性存储了该数组的__________。 6. 定义类就是定义一种抽象的____________,它是所有具有一定共性的对象的抽象描述。 7. 在Java语言,使用_____、______等技术,实现软件重用。 8. Java的复合数据类型有 : 类、数组和_______等。 9. 表达式3/6 * 5的计算结果是________ 。 10.定义初值为10的10次方的长整型变量 lvar 的语句是:__________________________。 11. 顺序结构、分支结构(或称选择结构)、____________是结构化程序设计的三种基本流程控制结构。 12. 以下方法 m 的功能是求两参数之积的整数部分。 int m ( float x, float y ) { __________________; } 13. Java 源程序文件编译后产生的文件称为________文件,其扩展名为 ___________ 。 三、判断( 每小1分,共15分 ) 下列各,你认为正确的就在其干后的括号内打"√",错误的打"×"。 1.Java 和 c++都是面向对象的程序设计语言。( ) 2.字符串 "\'a\'" 的长度是5。( ) 3. 同一个类定义多个参数列表不同的同名方法,叫做方法的重载。( ) 4. 一个类的定义包括定义类头和定义类体两个部分。( ) 5.一个程序里可以有多个父类,也可以有多个主类。( ) 6. 一个子类可以重新定义从父类那里继承来的同名方法,而且允许它们有不同的返回值。( ) 7.抽象方法只能存在于抽象类。( ) 8. 在父类声明为 final 的方法,也可以在其子类被重新定义(覆盖)。( ) 9. 接口所有方法均为抽象方法。( ) 10. False 是合法的 Java 标识符。( ) 11. 子类的类成员变量不能与其父类的类成员变量同名。( ) 12. static 变量不能是 private 变量。( ) 13. 保留字 this 代表当前对象。( ) 14. 类的构造函数名必须和类名相同。( ) 15. 子类的对象能直接向其父类对象赋值。( ) 四、程序填空( 每空2分,共20分 ) 阅读程序,根据程序功能,在指定的空白处填上适当的语句或语法成分,使程序完整。 1.下面是一个类的定义: public class ____________ { int x, y; Myclass ( int i, _______) // 构造函数 { x=i; y=j; } } 2.下面是用户程序对 Applet 类方法 paint( ) 的重新定义。 public void paint(Graphics ____ ) { int i=689; a.drawString ( ________+ i ,20,60); } 3.下面是一个Java Application 的主类的定义,其功能是输出所有命令行参数。 import java.io.*; public class MyClass { public static void main(String args[ ]) { if( args.length !=___) for(int i=0; i < args.length; i++) System.out.println(___________); else System.out.println("没有命令行参数"); } } 4.下面是一个小程序的主类myprogram的定义, 其A、B是该主类所在源程序已定义的另两个类的类名: import java awt.*; import java applet.*; public class myprogram extends Applet//定义小程序的主类 { A a; B b; public ________ init( ) { a=new A( ); b=_____ B( ); } } 5.下面程序的功能是输出数组各元素的和。 import java.awt.Graphics; import java.applet.Applet; public class SumArray extends Applet { float[] a; a= new _______[6]; float sum=0.0f; public void init( ) { for ( int j = 0; j < a.length; j++ ) a[j] = j+1; for ( int i = 0 ; i < a.length; i++ ) sum+= a[i]; } public void paint( Graphics g ) { g.drawString( "Total of array elements: " + ________ , 25, 25 ); } } 五、简答( 每1问2分,共20分 ) 阅读程序(或程序片段)并回答问 。 1. import java.awt.*; import java.applet.*; public class Test51` extends Applet { float[ ] x = {1.2, 3.4, 5.6, 7.8}; public void paint(Graphics g) { int s=0; for( int i = 0; i < x.length; i++ ) s += (int)x[i]; g.drawString(" " + s, 30, 60); } } 问: 1)程序的输出结果是什么? 2)方法paint()的循环体 s += (int)x[i]; 能写为 s +=x[i]; 吗? 为什么? 2. public class Test52 { String str1="Hello, Java world! \t"; String str2="Hello, students! "; public static void main(String args[]) { System.out.print(str1); System.out.println(str2); } } 问:1)这是哪种形式的 Java 程序 ? 2)程序的输出是什么?输出的结果在 Applet 窗口吗? 3. 设ch1, ch2是 char 型变量: if ( ch1 == ‘a' ) { if ( ch2 == ‘b' ) System.out.print(" ch1=\'a\' , ch2=\'b\' "); } else System.out.print(" ch1!=\'a\' "); System.out.println(" end "); 问: 1)若执行前 ch1 的值为 ‘a', ch2 的值为 'c' 该程序段输出是什么? 2)若执行前 ch1 的值为 'w', ch2 的值为 'b' 该程序段输出是什么? 3)若执行前 ch1 的值为 'a', ch2 的值为 'b' 该程序段输出是什么? 4.有如下源程序: import java.awt.*; import java.applet.*; public class Test54 extends Applet { B b; public void init( ) { b=new B( 'f', 87.6f, 69.1f); } public void paint(Graphics g) { g.drawString("序号 "+"性别 "+"成绩1 " +"成绩2 ",20,50); b.Print(g); } } class A { static int n=100; char ch; A( ) { n++; } A( char c){ this( ); ch=c; } void Print(Graphics g) { g.drawString(" "+n+" "+ch,20,70); } } class B extends A { float s1, s2; B(float r1,float r2){ s1=r1; s2=r2; } B( char c, float r1, float r2) { super(c); s1=r1; s2=r2; } void Print(Graphics g) { super.Print(g); g.drawString(" "+s1+" "+s2,40,70); } } 问: 该程序的输出是什么? 5.已知菲波那契数列的数学表达式为: fibonacci(n)=n, n=0,1; fibonacci(n)=fibonacci(n-1)+fibonacci(n-2), n≥2; 设 m 是 long 型变量,下面是用递归算法求菲波那契数列的方法: long fibonacci(long n) { if(n==0||n==1) return n; else return (fibonacci(n-1)+fibonacci(n-2)); } 问: 当语句 m=fibonacci(3); 执行时,方法 fibonacci( )被调用了几次? 6. 下面是一个排序的程序: import java.io.*; public class Test56_Sort { public static void main(String args[ ]) { int[] a={42,99,5,63,95,36,2,69,200,96}; System.out.println("排序前的数据序列:"); ShowArray(a); Sort(a); System.out.println("排序后的数据序列:"); ShowArray(a); } public static void Sort(int[] x) { int w; for(int i=1; i<x.length; i++) { for(int j=0; j<x.length-1; j++) if(x[j]>x[j+1]) { w=x[j]; x[j]=x[j+1]; x[j+1]=w; } /* if(i==1||i==2) ShowArray(x); if(i==2) break; */ } } public static void ShowArray(int b[]) { for(int i=0; i<b.length; i++) System.out.print(" "+b[i]); System.out.println(" "); } } 问: 如果将方法Sort( )的一对注释符(/* */)去掉,程序输出的结果是什么?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GaoGuohao2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值