我在C中编写一个脚本来打印出pascals三角形,所以我为factorial编写了一个函数,然后将变量c =变为二项式展开式,这直到第n行,它产生输出:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 1 12 66 220 495 792 924 792 495 220 66 12 1 0 4 24 88 221 399 532 532 399 221 88 24 4 0
最后一行是n = 13.我原本认为它是破坏的,因为对于32位整数,因子会很大但是64位整数仍然存在错误...
#include#include #include #include int64_t factorial(int k); int main(int argc, char **argv) { int c, n, r, i; if (argc < 2) { printf("[function]: %s [number of lines to print]", argv[0]); return -1; } n = atoi(argv[1]); for (i = 0; i <= n; i++) { for (r = 0; r <= i; r++) { c = (int) factorial(i) / (factorial(r) * factorial((i - r))); printf("%d ", c); } printf("\n"); } return 1; } int64_t factorial(int k) { int64_t j; if (k == 0 || k == 1) return 1; int n = k; for (j = k; n > 1;) j = j * --n; return j; }
我非常感谢对此有所帮助......
你的计算甚至在64位时都失败了,因为你用脚趾射击自己的脚(它很痛):
c = (int) factorial(i) / (factorial(r) * factorial((i - r)));
被解析为
c = ((int)factorial(i)) / (factorial(r) * factorial((i - r)));
只需删除演员表或将其放在结果上:
c = (int)(factorial(i) / (factorial(r) * factorial(i - r)));
请注意,您的factorial
功能太复杂了,这是一个更简单的版本:
int64_t factorial(int n) { int64_t x; for (x = 1; n > 1; n--) { x *= n; } return x; }
另请注意,您不需要计算全因子,此版本为29,并且可以通过一些工作进一步改进:
#include#include long long binomial(int n, int p) { int q; long long x; if (p < n - p) p = n - p; q = n - p; for (x = 1; n > p; n--) x *= n; for (; q > 1; q--) x /= q; return x; } int main(int argc, char **argv) { int n, r, i; if (argc < 2) { printf("[function]: %s [number of lines to print]", argv[0]); return -1; } n = atoi(argv[1]); for (i = 0; i <= n; i++) { for (r = 0; r <= i; r++) { printf("%lld ", binomial(i, r)); } printf("\n"); } return 0; }
最后,如果允许使用数组,则可以进一步简化Pascal三角形的计算,因为每个系数是它上面的那个和该那个的左边一个的总和:
#include#include int main(int argc, char **argv) { int n, r, i; if (argc < 2) { printf("[function]: %s [number of lines to print]", argv[0]); return -1; } n = atoi(argv[1]); long long coeff[n + 1]; coeff[0] = 1; for (r = 1; r <= n; r++) { coeff[r] = 0; } for (i = 0; i <= n; i++) { for (r = i; r > 0; r--) { coeff[r] += coeff[r - 1]; } for (r = 0; r <= i; r++) { printf("%lld ", coeff[r]); } printf("\n"); } return 0; }