1.4132:四则运算表达式求值
#include<cstdio>
#include<iostream>//cin cout
#include<string.h>//<string>ÊDz»¶ÔµÄ£¬Ó¦¸Ã¼Ó.h
#include<cstdlib>
#include<cmath>
#include<vector>//¶þάÊý×é
#include<algorithm>//
#include<set>//¼¯ºÏ
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
using namespace std;
const int maxn=1010;
const int inf=0x3fffffff;
const double minx=1e-8;
double expression_value();
double factor_value(){
double value=0;
char c=cin.peek();
if(c=='('){
cin.get();
value=expression_value();
cin.get();
}
else{
while(isdigit(c)){
value=value*10+(c-'0');
cin.get();
c=cin.peek();
}
if(c=='.'){
cin.get();
c=cin.peek();
double mindigit=0;
int num=0;
while(isdigit(c)){
num++;
mindigit=mindigit*10+(c-'0');
cin.get();
c=cin.peek();
}
double divid=pow(10.0,1.0*num);
mindigit=mindigit*1.0/divid;
value+=mindigit;
}
}
return value;
}
double term_value(){
double results=factor_value();
bool more=1;
while(more){
char c=cin.peek();
if(c=='*'||c=='/'){
cin.get();
double value=factor_value();
if(c=='*')results*= value;
if(c=='/')results/= value;
}
else {
more=0;
}
}
return results;
}
double expression_value(){
double results=term_value();
bool more=1;
while(more){
char c=cin.peek();
if(c=='+'||c=='-'){
cin.get();
double value=term_value();
if(c=='+')results+= value;
if(c=='-')results-= value;
}
else {
more=0;
}
}
return results;
}
int main(){
printf("%.2lf\n",expression_value());
system("pause");
return 0;
}
注意:(1).递归解决,多项式,单项式,单值,分别解决;
(2).char c=cin.peek();cin.get();//混合用法
2.爬楼梯
#include<iostream>//cin cout
#include<string.h>//<string>ÊDz»¶ÔµÄ£¬Ó¦¸Ã¼Ó.h
#include<cstdlib>
#include<cmath>
#include<vector>//¶þάÊý×é
#include<algorithm>//
#include<set>//¼¯ºÏ
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
using namespace std;
const int maxn=1010;
const int inf=0x3fffffff;
const double minx=1e-8;
int f(int n){
if(n==1)return 1;
if(n<=0)return 0;
if(n==2)return 2;
return f(n-1)+f(n-2);
}
int main(){
int n;
while(cin>>n){
int sum=f(n);
cout<<sum<<endl;
}
system("pause");
return 0;
}
注意:递归解决,f(n)=f(n-1)+f(n-2);
3.1664:Placing apples
#include<cstdio>
#include<iostream>//cin cout
#include<string.h>//<string>ÊDz»¶ÔµÄ£¬Ó¦¸Ã¼Ó.h
#include<cstdlib>
#include<cmath>
#include<vector>//¶þάÊý×é
#include<algorithm>//
#include<set>//¼¯ºÏ
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
using namespace std;
const int maxn=1010;
const int inf=0x3fffffff;
const double minx=1e-8;
int f(int apples,int pan){
if(apples==0)return 1;
if(pan<=0)return 0;
if(apples>=pan){
return f(apples,pan-1)+f(apples-pan,pan);
}
if(apples<pan){
return f(apples,apples);
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
cout<<f(a,b)<<endl;
}
system("pause");
return 0;
}
注意:(1).递归分类讨论,最后一个盘子加入苹果或者不加入苹果。
4.算24
#include<cstdio>#include<iostream>//cin cout
#include<string.h>//<string>ÊDz»¶ÔµÄ£¬Ó¦¸Ã¼Ó.h
#include<cstdlib>
#include<cmath>
#include<vector>//¶þάÊý×é
#include<algorithm>//
#include<set>//¼¯ºÏ
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
using namespace std;
const int maxn=1010;
const int inf=0x3fffffff;
const double minx=1e-8;
double a[5];
bool isZero(double x){
if(fabs(x)<minx)return 1;
return 0;
}
bool f(double a[],int n){
if(n==1){
if(isZero(a[0]-24))return 1;
else return 0;
}
double b[5];
memset(b,0,sizeof(b));
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
int m=0;
for(int k=0;k<n;k++){
if(k!=i&&k!=j){
b[m++]=a[k];
}
}
b[m]=a[i]+a[j];
if(f(b,m+1))return 1;
b[m]=a[i]-a[j];
if(f(b,m+1))return 1;
b[m]=a[j]-a[i];
if(f(b,m+1))return 1;
b[m]=a[i]*a[j];
if(f(b,m+1))return 1;
if(a[i]!=0){
b[m]=a[j]/a[i];
if(f(b,m+1))return 1;
}
if(a[j]!=0){
b[m]=a[i]/a[j];
if(f(b,m+1))return 1;
}
}
}
return 0;
}
int main(){
while(1){
for(int i=0;i<4;i++){
cin>>a[i];
}
if(isZero(a[0]))break;
if(f(a,4)==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
system("pause");
return 0;
}
注意:算式问题的本质就是递归。