• POJ 1850


     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 int fac(int num);
     6 
     7 int C(int n,int m);
     8 int com( int n, int k );
     9 int main()
    10 {
    11     //freopen("acm.acm","r",stdin);
    12     string s;
    13     int sum;
    14     int j;
    15     int i;
    16 //    cout<<com(4,2)<<endl;
    17 
    18     while(cin>>s)
    19     {
    20         sum = 0;
    21         for(i = 0; i < s.length()-1; ++ i)//把前面的都加起来,看看这个字符串len-1个长度的+len-2····1的字符串一共有多少个
    22         {
    23             sum += com(26,i+1);
    24         }
    25 //        cout<<s<<endl;
    26 //        cout<<"sum        "<<sum<<endl;
    27     
    28         //cout<<"len "<<s.length()<<endl;
    29         for(i = 0; i < s.length(); ++ i)
    30         {
    31             for(j = i+1; j < s.length(); ++ j)
    32             {
    33                 if(s[i] >= s[j])
    34                 {
    35                     break;
    36                 }
    37             }
    38             if(j != s.length()) //
    39             {
    40                 break;
    41             }
    42         }
    43         if(i != s.length())    //如果字符串不是按照升序排列的,那么要输出0;
    44         {
    45             cout<<0<<endl;
    46             continue;
    47         }
    48         for(i = 0; i < s.length(); ++ i)    //看看当前的字符串在“本长度”中排在什么样的位置。
    49         {
    50             if(i == 0)
    51             {
    52                 j = 0;
    53             }
    54             else
    55             {
    56                 j = s[i-1]-'a'+1;
    57             }
    58             for(; j < s[i]-'a'; ++ j)    //现在依然是在计算 与当前字符串一样长度的字符串的数量(之前的 ~ )
    59             {
    60                 sum += com(26-j-1,s.length()-i-1);//这个组合是固定开头的字符,选取后面的!
    61             }//计算的过程是比如说第一个位置是k,开始固定'a'那么以后的len-1个位置上就是从b~z中选出组合,然后再固定b再选,……
    62                         //直到第一个位置是k本身,第一个位置枚举完了,枚举地二个位置,从a开始直到第二个位置的字符本身,依次类推,直到最后一个字符枚举完毕,本        //字符串之前的就算计算完了 因为这样枚举都是本字符串之前                        //的了~
    63         }
    64         cout<<sum+1<<endl;
    65 
    66     }
    67 }
    68 
    69 int C(int n,int m)
    70 {
    71     return fac(n)/(fac(m)*fac(n-m));
    72 }
    73 
    74 int fac(int num)
    75 {
    76     int i;
    77     int sum = 1;
    78     for(i = 1; i <= num; ++ i)
    79     {
    80         sum *= i;
    81     }
    82     return sum;
    83 }
    84 
    85 int com( int n, int k )  //如果用常规的 以前的很笨的方法,会造成大数的溢出
    86 {
    87 
    88 if ( k>0 )
    89 {
    90    return com(n-1, k-1 ) * n / k;//组合公式
    91 }
    92 return 1;
    93 }

    关注我的公众号,当然,如果你对Java, Scala, Python等技术经验,以及编程日记,感兴趣的话。 

    技术网站地址: vmfor.com

  • 相关阅读:
    .Net Core自动化部署系列(一):Jenkins + GitLab
    经典案例复盘——运维专家讲述如何实现K8S落地(摘抄)
    Quartz系列(一):基础介绍
    生产环境项目问题记录系列(二):同步方法调用异步方法
    微服务理论系列(一):服务发现四问四答(摘抄)
    Java中的继承、封装、多态的理解
    Java三大主流框架概述
    面试的技巧
    myBaits持久性框架
    MyBaits框架入门总结
  • 原文地址:https://www.cnblogs.com/gavinsp/p/4566562.html
Copyright © 2020-2023  润新知