辽宁师范大学 • 张大为@https://daweizh.github.io/noip/
给定n(n>=1),用递归的方法计算1+2+3+...+(n-1)+n。
#include <iostream> using namespace std; int n; int f(int); int main(){ cin >> n; cout << f(n) << endl; return 0; } int f(int x){ if(x==1) return 1; return x+f(x-1); }
满足 的数列称为斐波那契数列(Fibonacci),它的前若干项是1,1,2,3,5,8,13,21,34,....求词数列第n项(n>=3)。
#include <iostream> using namespace std; int n; int f(int); int main(){ cin >> n; cout << f(n) << endl; return 0; } int f(int x){ if(x==1||x==2) return 1; return f(x-1)+f(x-2); }
给定两个正整数a,b求它们的最大公约数gcd(a,b)。
#include <iostream> using namespace std; int a,b; int gcd(int,int); int main(){ cin >> a >> b; cout << gcd(a,b) << endl; return 0; } int gcd(int x,int y){ if(x%y==0) return y; return gcd(y,x%y); }
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
#include <iostream> #include <string> #include <cmath> using namespace std; string s; double f(); int main(){ printf("%f",f()); return 0; } double f(){ cin >> s; if(s=="+") return f()+f(); else if(s=="-") return f()-f(); else if(s=="*") return f()*f(); else if(s=="/") return f()/f(); else return atof(s.c_str()); }
设有n个数已经按从大到小的顺序排列,现在输入x,判断它是否在这n个数中,如果存在则输出“YES”,否则输出“NO”。
#include <iostream> using namespace std; int a[100],n,x,lft,rgt; void search(int,int,int); int main(){ cin >> n; lft = 0; rgt = n-1; for(int i=0;i<n;i++) cin >> a[i]; cin >>x; search(x,lft,rgt); return 0; } void search(int x,int l,int r){ if(l<=r){ int mid = (l+r)/2; if(a[mid]==x){ cout << "YES" << endl; return; }else{ if(a[mid]>x) search(x,mid+1,r); else search(x,l,mid-1); } }else{ cout << "NO" << endl; } }
有n个圆盘,依半径大小(半径都不同),自下而上套在a柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除a柱外,还有b柱和c柱,开始时这两个柱子上无盘子),但绝不允许发生柱子上出现大盘子在上小盘子在下的情况。现要求设计将a柱子上n个盘子搬移到c柱去的方法。
#include <iostream> using namespace std; int k=0,n; void move(int,char,char, char); int main(){ cin >> n; move(n,'a','b','c'); return 0; } void move(int n,char a,char c,char b){ if(n==0) return; move(n-1,a,b,c); cout << ++k << ": " << a << "->" << n << "->" << c << endl; move(n-1,b,a,c); }
设S是一个具有n个元素的集合,,现将S划分成k个满足下列条件的子集合,且满足:
则称 是集合S的一个划分。他相当于把S集合中的n个元素 放入k个(0<k<=n<30)无标号的盒子中,使得没有一个盒子为空。请你确定n个元素 放入k个无标号盒子中去的划分数S(n,k)。
输入样例: 10 6
输出样例: 22827
算法分析:
#include <iostream> using namespace std; int n,k; int s(int,int); int main(){ cin >> n >> k; cout << s(n,k) << endl; return 0; } int s(int n,int k){ if((n<k)||(k==0)) return 0; if((k==1)||(k==n)) return 1; return s(n-1,k-1) + k*s(n-1,k); }
我们要求找出具有下列性质数的个数(包括输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
#include <iostream> using namespace std; int ans=0; void dfs(int m){ ans++; for(int i=1;i<=m/2;i++){ dfs(i); } cout << ","; } int main(){ int n; cin >> n; dfs(n); cout << ans << endl; return 0; }
#include <iostream> #include <cstring> using namespace std; int h[1001]; void dfs(int m){ if(h[m]!=-1) return; h[m]=1; for(int i=1;i<=m/2;i++){ dfs(i); h[m]=h[m]+h[i]; } } int main(){ int n; memset(h,-1,sizeof(h)); cin >> n; dfs(n); cout << h[n] << endl; return 0; }
#include <iostream> using namespace std; int h[10001]; int main(){ int n; cin >> n; for(int i=1;i<=n;i++){ h[i]=1; for(int j=1;j<=i/2;j++) h[i]+=h[j]; } cout << h[n] << endl; return 0; }
已知,
令 ,
则,。
#include <iostream> using namespace std; int h[1001],s[1001]; int main(){ int n; cin >> n; for(int i=1;i<=n;i++){ h[i]=1+s[i/2]; s[i]=s[i-1]+h[i]; } cout << h[n] << endl; return 0; }
由h(1)=1,h(2)=2,h(3)=2,h(4)=4,h(5)=4,h(6)=6,h(7)=6,h(8)=10,h(9)=10,...,可知:
#include <iostream> using namespace std; int h[1001]; int main(){ int n; cin >> n; h[1]=1; for(int i=2;i<=n;i++){ h[i]=h[i-1]; if(i%2==0) h[i]=h[i-1]+h[i/2]; } cout << h[n] << endl; return 0; }
#include <iostream> #include <string> #include <cmath> using namespace std; string s; double f(){ cin >> s; if(s=="+") return f()+f(); else if(s=="-") return f()-f(); else if(s=="*") return f()*f(); else if(s=="/") return f()/f(); else return atof(s.c_str()); } int main(){ printf("%f",f()); return 0; }
#include <iostream> #include <string> #include <cstring> using namespace std; string s; int f[10],len; char ch[10]; void abc(int d){ for(int i=0;i<len;i++){ if(f[i]==0){ f[i]=1; ch[d]=s[i]; if(d==len-1){ for(int j=0;j<len;j++) cout << ch[j]; cout << endl; }else abc(d+1); f[i]=0; } } } int main(){ cin >>s; len = s.size(); abc(0); return 0; }
#include <iostream> using namespace std; int n,x; int dfs(int a,int b){ if(a==1) return 1; if(b==1) return 0; if(a%b==0) return dfs(a/b,b)+dfs(a,b-1); return dfs(a,b-1); } int main(){ cin >> n; for(int i=0;i<n;i++){ cin >> x; cout << dfs(x,x) << endl; } return 0; }
#include <iostream> using namespace std; int n,a; int fb(int x){ int f0=1,f1=1,f2; for(int i=3;i<=x;i++){ f2=f1+f0; f0=f1; f1=f2; } return f2; } int main(){ cin >> n; while(n--){ cin >> a; if(a<3) cout << 1 << endl; else cout << fb(a) << endl; } return 0; }
#include <iostream> #include <string> #include <set> #include <cstdio> using namespace std; string s; int grp=1; void ds(int l){ set<string> f; cin >> s; if(s[0]=='#') return; if(l==1){ cout << "DATA SET " << grp << ":" << endl; cout << "ROOT" << endl; } do{ if(s[0]=='f'){ f.insert(s); } else if(s[0]=='d'){ for(int i=0;i<l;i++) cout << "| "; cout << s << endl; ds(l+1); }else if(s[0]==']'){ break; } cin >> s; }while(s[0]!='*' && s[0]!=']'); for(set<string>::iterator it=f.begin();it!=f.end();it++){ for(int i=1;i<l;i++) cout << "| "; cout << *it << endl; } } int main(){ do{ ds(1); grp++; cout << endl; }while(s[0]!='#'); return 0; }
#include <iostream> using namespace std; const int mod = 32767; int n,x,a[1000005]; int pell(int n){ if(a[n]) return a[n]; if(n==1) return 1; if(n==2) return 2; return a[n]=((pell(n-1) *2)%mod+ pell(n-2)%mod)%mod; } int main(){ cin >> n; for(int i=0;i<n;i++){ cin >> x; cout << pell(x) << endl; } return 0; }
#include <iostream> using namespace std; int f(int n){ if(n==1) return 1; if(n==2) return 2; return f(n-1) + f(n-2); } int x; int main(){ while(cin>>x){ cout << f(x) << endl; } return 0; }
#include <iostream> using namespace std; int n; char a,b,c; void move(int n,char a,char c,char b){ if(n==0) return; move(n-1,a,b,c); cout << a << "->" << n << "->" << c << endl; move(n-1,b,c,a); } int main(){ cin >> n >> a >> b >> c; move(n,a,b,c); return 0; }
#include <iostream> using namespace std; int apple(int a,int b){ if(b==1 || a==0) return 1; if(b>a) return apple(a,a); return apple(a-b,b) + apple(a,b-1); } int g,n,m; int main(){ cin >> g; for(int i=0;i<g;i++){ cin >> n >> m; cout << apple(n,m) << endl; } return 0; }
#include <iostream> using namespace std; int gcd(int a,int b){ int r = a%b; while(r){ a=b; b=r; r=a%b; } return b; } int main(){ int x,y; cin >> x >> y; cout << gcd(x,y) << endl; return 0; }
#include <iostream> using namespace std; void pw(int x){ int p=1,cnt=0; while(p<=x){ p=p*2; cnt++; } if(cnt-1==0) cout << "2(0)" ; else if(cnt-1==1) cout << "2"; else if(cnt-1==2) cout << "2(2)"; else{ cout << "2(" ; pw(cnt-1); cout << ")"; } if(x-p/2>0){ cout << "+"; pw(x-p/2); } } int main(){ int n; cin >> n; pw(n); return 0; }