user-0 提问: 求组合数

回复:
user: user-1
content: 1楼代码的功能是求100!

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 hongss 的回复:] 根据公式来 double ZuHe( int n_C, int n_r ) { 	int n_Sum[3] = { 1, 1, 1 }; 	for(int i=1; i<=n_C; i++) 	{ 		n_Sum[0] *= i; 	} 	for(int i=1; i<=n_r; i++) 	{ 		n_Sum[1] *= i; 	} 	for(int i=1; i<=( n_C - n_r ); i++) 	{ 		n_Sum[2] *= i; 	}  	return n_Sum[0] / ( n_Sum[1] * n_Sum[2] * 1.0f ); } 万一n是12345678901234567890123456789012345678901234567890123456789012345678901234567890呢？！[/quote]  呵呵，没考虑到会有那么大~~~ 这是以前做的一个检测程序里的片段，求两片模板配合度的，每天的量也就几十对~~~

user: user-1
content: 引用 2 楼 hongss 的回复:根据公式来 double ZuHe( int n_C, int n_r ) { 	int n_Sum[3] = { 1, 1, 1 }; 	for(int i=1; i<=n_C; i++) 	{ 		n_Sum[0] *= i; 	} 	for(int i=1; i<=n_r; i++) 	{ 		n_Sum[1] *= i; 	} 	for(int i=1; i<=( n_C - n_r ); i++) 	{ 		n_Sum[2] *= i; 	}  	return n_Sum[0] / ( n_Sum[1] * n_Sum[2] * 1.0f ); } 万一n是12345678901234567890123456789012345678901234567890123456789012345678901234567890呢？！

user: user-2
content: 根据公式来 double ZuHe( int n_C, int n_r ) { 	int n_Sum[3] = { 1, 1, 1 }; 	for(int i=1; i<=n_C; i++) 	{ 		n_Sum[0] *= i; 	} 	for(int i=1; i<=n_r; i++) 	{ 		n_Sum[1] *= i; 	} 	for(int i=1; i<=( n_C - n_r ); i++) 	{ 		n_Sum[2] *= i; 	}  	return n_Sum[0] / ( n_Sum[1] * n_Sum[2] * 1.0f ); }

user: user-1
content: 仅供参考：#include <iostream> #include <string> #include <algorithm> using namespace std; inline int COMPARE(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string PLUS(string number1,string number2) {     int i;     int length1 = number1.size();     int length2 = number2.size();      string result="";      reverse(number1.begin(), number1.end());     reverse(number2.begin(), number2.end());      for(i = 0; i < length1 && i < length2; i++) {         char c = (char)(number1[i] + number2[i] - 48);         result = result + c;     }      while(i < length1) {         result = result + number1[i];         ++i;     }      while(i < length2) {         result = result + number2[i];         ++i;     }      int carry = 0;     for(i = 0; i < (int)result.size(); ++i) {         int value = result[i] - 48 + carry;         result[i] = (char)(value % 10 + 48);         carry = value / 10;     }      if(carry !=0 ) {         result = result + (char)(carry + 48);     }      for(i = result.size() - 1; i >= 0; i--) {         if(result[i] != '0') break;     }      result = result.substr(0, i + 1);      reverse(result.begin(), result.end());     if(result.length() == 0) result = "0";     return result; } string MULTIPLY(string number1, string number2) {     int i, j;     int *iresult;     int length1 = number1.size();     int length2 = number2.size();     string result = "";      reverse(number1.begin(), number1.end());     reverse(number2.begin(), number2.end());      iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));     memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));      for(i = 0; i < length1; i++) {         for(j = 0; j < length2; j++) {             iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));         }     }      int carry = 0;     for(i = 0; i < length1 + length2; i++) {         int value = iresult[i] + carry;         iresult[i] = value % 10;         carry = value / 10;     }      for(i = length1 + length2 - 1; i >= 0; i--) {         if(iresult[i] != 0)break;     }      for(; i >= 0; i--) {         result = result + (char)(iresult[i]+48);     }      free(iresult);      if(result == "") result = "0";     return result; } string factorial(string n) {     string temp = "1";     string i;     for(i = "1"; COMPARE(i, n) <= 0; i = PLUS(i, "1")) {         temp = MULTIPLY(temp, i);     }     return temp; } int main(void) {     cout << factorial("100") << endl;     return 0; } //93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 //

user: user-0
content: 其实就是这个题目  Racebug出门春游，需要带一些食物，包括薯片，巧克力，矿泉水，汉堡，牛奶和糖果。经过估计，他觉得带n(n<=100000)件食物比较合适，但他还有一些癖好：  最多带1个汉堡  巧克力的块数是5的倍数  最多带4瓶矿泉水  薯片的包数是一个偶数  最多带3罐牛奶  糖果的个数是4的倍数  问 Racebug有多少种方式来准备这次旅行所带的食物 其实直接求公式也能运行出来 ...但是要求用到数据结构

user: user-1
content: 能引入不超过50行的库函数源代码，决不引入库函数本身！

user: user-3
content: 既然要求很明确，那就来一个简单的答案吧！ C(n+2, 2) = (n+2) * (n+1) / 2 当 n 是偶数时 = (n+2) / 2 * (n+1) 否则 = (n+1) / 2 * (n+2）  用C/C++可以这么写： return (n & 1) ? (n + 1) / 2 * (n + 2) : (n + 2) / 2 * (n + 1);  如果n非常大，引入一个大整数的库来计算就可以了；上一个语句按照大整数库的要求改写一下就OK

user: user-1
content: https://www.baidu.com/s?wd=组合数公式

user: user-4
content: C(n+2,2)=(n+2)*(n+1)/2，显然n+2和n+1中必然有一个偶数，判断一下把它除以2再乘另一个数就可以了。