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