第三周

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<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 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;        
}  

注意:算式问题的本质就是递归。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值