烷烃同分异构体数目的计算

相信大家在学习高中的有机化学时,老师一定会给你讲过一类找烷烃同分异构体的题目吧?

而且老师还会说这种题只能靠动手画图,没有数学公式来计算,只有画的做到不重复不遗漏考试才能得到分。不少人为此绞尽脑汁。那么如果我们想知道几十个C原子能组成多少同分异构体怎么办呢?要一个一个地画吗?那估计穷尽一生也画不完。因为烷烃同分异构的数目变化和C原子的数目是不成线性变化的。

那么就没有计算的方法了吗?

其实不然,我么可以用Polya计数定理来推算烷烃同分异构的数目。
当然在这里我就不赘述数学上的证明了,有兴趣的小伙伴可以自行查阅有关书籍。

这个代码段通过高精度模版实现了任意碳原子数目构成同分异构体数目的计算。
它把同分异构体数目的计算巧妙等价转换成了烷基数目的计算,大大简化了计算难度。
然而,由于该算法存在不小的时间复杂度,也许1000以上个C原子组成的烷烃会计算很长时间。

源代码如下          注意:只能计算出链结构的烷烃

#include <iostream>
#include <cstring>#define DIGIT    4
#define DEPTH    10000
#define MAX     100
using namespace std;
typedef int bignum_t[MAX + 1];
int read(bignum_t a, istream& is = cin) {char buf[MAX * DIGIT + 1], ch;int i, j;memset((void*)a, 0, sizeof(bignum_t));if (!(is >> buf))    return 0;for (a[0] = strlen(buf), i = a[0] / 2 - 1; i >= 0; i--)ch = buf[i], buf[i] = buf[a[0] - 1 - i], buf[a[0] - 1 - i] = ch;for (a[0] = (a[0] + DIGIT - 1) / DIGIT, j = strlen(buf); j < a[0] * DIGIT; buf[j++] = '0');for (i = 1; i <= a[0]; i++)for (a[i] = 0, j = 0; j < DIGIT; j++)a[i] = a[i] * 10 + buf[i * DIGIT - 1 - j] - '0';for (; !a[a[0]] && a[0] > 1; a[0]--);return 1;
}
void write(const bignum_t a, ostream& os = cout) {int i, j;for (os << a[i = a[0]], i--; i; i--)for (j = DEPTH / 10; j; j /= 10)os << a[i] / j % 10;
}
int comp(const bignum_t a, const bignum_t b) {int i;if (a[0] != b[0])return a[0] - b[0];for (i = a[0]; i; i--)if (a[i] != b[i])return a[i] - b[i];return 0;
}
int comp(const bignum_t a, const int b) {int c[12] = { 1 };for (c[1] = b; c[c[0]] >= DEPTH; c[c[0] + 1] = c[c[0]] / DEPTH, c[c[0]] %= DEPTH, c[0]++);return comp(a, c);
}
int comp(const bignum_t a, const int c, const int d, const bignum_t b) {int i, t = 0, O = -DEPTH * 2;if (b[0] - a[0] < d && c)return 1;for (i = b[0]; i > d; i--) {t = t * DEPTH + a[i - d] * c - b[i];if (t > 0) return 1;if (t < O) return 0;}for (i = d; i; i--) {t = t * DEPTH - b[i];if (t > 0) return 1;if (t < O) return 0;}return t > 0;
}
void add(bignum_t a, const bignum_t b) {int i;for (i = 1; i <= b[0]; i++)if ((a[i] += b[i]) >= DEPTH)a[i] -= DEPTH, a[i + 1]++;if (b[0] >= a[0])a[0] = b[0];elsefor (; a[i] >= DEPTH && i < a[0]; a[i] -= DEPTH, i++, a[i]++);a[0] += (a[a[0] + 1] > 0);
}
void add(bignum_t a, const int b) {int i = 1;for (a[1] += b; a[i] >= DEPTH && i < a[0]; a[i + 1] += a[i] / DEPTH, a[i] %= DEPTH, i++);for (; a[a[0]] >= DEPTH; a[a[0] + 1] = a[a[0]] / DEPTH, a[a[0]] %= DEPTH, a[0]++);
}
void sub(bignum_t a, const bignum_t b) {int i;for (i = 1; i <= b[0]; i++)if ((a[i] -= b[i]) < 0)a[i + 1]--, a[i] += DEPTH;for (; a[i] < 0; a[i] += DEPTH, i++, a[i]--);for (; !a[a[0]] && a[0] > 1; a[0]--);
}
void sub(bignum_t a, const int b) {int i = 1;for (a[1] -= b; a[i] < 0; a[i + 1] += (a[i] - DEPTH + 1) / DEPTH, a[i] -= (a[i] - DEPTH + 1) / DEPTH * DEPTH, i++);for (; !a[a[0]] && a[0] > 1; a[0]--);
}
void sub(bignum_t a, const bignum_t b, const int c, const int d) {int i, O = b[0] + d;for (i = 1 + d; i <= O; i++)if ((a[i] -= b[i - d] * c) < 0)a[i + 1] += (a[i] - DEPTH + 1) / DEPTH, a[i] -= (a[i] - DEPTH + 1) / DEPTH * DEPTH;for (; a[i] < 0; a[i + 1] += (a[i] - DEPTH + 1) / DEPTH, a[i] -= (a[i] - DEPTH + 1) / DEPTH * DEPTH, i++);for (; !a[a[0]] && a[0] > 1; a[0]--);
}
void mul(bignum_t c, const bignum_t a, const bignum_t b) {int i, j;memset((void*)c, 0, sizeof(bignum_t));for (c[0] = a[0] + b[0] - 1, i = 1; i <= a[0]; i++)for (j = 1; j <= b[0]; j++)if ((c[i + j - 1] += a[i] * b[j]) >= DEPTH)c[i + j] += c[i + j - 1] / DEPTH, c[i + j - 1] %= DEPTH;for (c[0] += (c[c[0] + 1] > 0); !c[c[0]] && c[0] > 1; c[0]--);
}
void mul(bignum_t a, const int b) {int i;for (a[1] *= b, i = 2; i <= a[0]; i++) {a[i] *= b;if (a[i - 1] >= DEPTH)a[i] += a[i - 1] / DEPTH, a[i - 1] %= DEPTH;}for (; a[a[0]] >= DEPTH; a[a[0] + 1] = a[a[0]] / DEPTH, a[a[0]] %= DEPTH, a[0]++);for (; !a[a[0]] && a[0] > 1; a[0]--);
}
void mul(bignum_t b, const bignum_t a, const int c, const int d) {int i;memset((void*)b, 0, sizeof(bignum_t));for (b[0] = a[0] + d, i = d + 1; i <= b[0]; i++)if ((b[i] += a[i - d] * c) >= DEPTH)b[i + 1] += b[i] / DEPTH, b[i] %= DEPTH;for (; b[b[0] + 1]; b[0]++, b[b[0] + 1] = b[b[0]] / DEPTH, b[b[0]] %= DEPTH);for (; !b[b[0]] && b[0] > 1; b[0]--);
}
void div(bignum_t c, bignum_t a, const bignum_t b) {int h, l, m, i;memset((void*)c, 0, sizeof(bignum_t));c[0] = (b[0] < a[0] + 1) ? (a[0] - b[0] + 2) : 1;for (i = c[0]; i; sub(a, b, c[i] = m, i - 1), i--)for (h = DEPTH - 1, l = 0, m = (h + l + 1) >> 1; h > l; m = (h + l + 1) >> 1)if (comp(b, m, i - 1, a)) h = m - 1;else l = m;for (; !c[c[0]] && c[0] > 1; c[0]--);c[0] = c[0] > 1 ? c[0] : 1;
}
void div(bignum_t a, const int b, int& c) {int i;for (c = 0, i = a[0]; i; c = c * DEPTH + a[i], a[i] = c / b, c %= b, i--);for (; !a[a[0]] && a[0] > 1; a[0]--);
}
void sqrt(bignum_t b, bignum_t a) {int h, l, m, i;memset((void*)b, 0, sizeof(bignum_t));for (i = b[0] = (a[0] + 1) >> 1; i; sub(a, b, m, i - 1), b[i] += m, i--)for (h = DEPTH - 1, l = 0, b[i] = m = (h + l + 1) >> 1; h > l; b[i] = m = (h + l + 1) >> 1)if (comp(b, m, i - 1, a)) h = m - 1;else l = m;for (; !b[b[0]] && b[0] > 1; b[0]--);for (i = 1; i <= b[0]; b[i++] >>= 1);
}
int length(const bignum_t a) {int t, ret;for (ret = (a[0] - 1) * DIGIT, t = a[a[0]]; t; t /= 10, ret++);return ret > 0 ? ret : 1;
}
int digit(const bignum_t a, const int b) {int i, ret;for (ret = a[(b - 1) / DIGIT + 1], i = (b - 1) % DIGIT; i; ret /= 10, i--);return ret % 10;
}
int zeronum(const bignum_t a) {int ret, t;for (ret = 0; !a[ret + 1]; ret++);for (t = a[ret + 1], ret *= DIGIT; !(t % 10); t /= 10, ret++);return ret;
}
void comp(int* a, const int l, const int h, const int d) {int i, j, t;for (i = l; i <= h; i++)for (t = i, j = 2; t > 1; j++)while (!(t % j))a[j] += d, t /= j;
}
void convert(int* a, const int h, bignum_t b) {int i, j, t = 1;memset(b, 0, sizeof(bignum_t));for (b[0] = b[1] = 1, i = 2; i <= h; i++)if (a[i])for (j = a[i]; j; t *= i, j--)if (t * i > DEPTH)mul(b, t), t = 1;mul(b, t);
}
void combination(bignum_t a, int m, int n) {int* t = new int[m + 1];memset((void*)t, 0, sizeof(int) * (m + 1));comp(t, n + 1, m, 1);comp(t, 2, m - n, -1);convert(t, m, a);delete[]t;
}
void permutation(bignum_t a, int m, int n) {int i, t = 1;memset(a, 0, sizeof(bignum_t));a[0] = a[1] = 1;for (i = m - n + 1; i <= m; t *= i++)if (t * i > DEPTH)mul(a, t), t = 1;mul(a, t);
}#define SGN(x) ((x)>0?1:((x)<0?-1:0))
#define ABS(x) ((x)>0?(x):-(x))int read(bignum_t a, int& sgn, istream& is = cin) {char str[MAX * DIGIT + 2], ch, * buf;int i, j;memset((void*)a, 0, sizeof(bignum_t));if (!(is >> str)) return 0;buf = str, sgn = 1;if (*buf == '-') sgn = -1, buf++;for (a[0] = strlen(buf), i = a[0] / 2 - 1; i >= 0; i--)ch = buf[i], buf[i] = buf[a[0] - 1 - i], buf[a[0] - 1 - i] = ch;for (a[0] = (a[0] + DIGIT - 1) / DIGIT, j = strlen(buf); j < a[0] * DIGIT; buf[j++] = '0');for (i = 1; i <= a[0]; i++)for (a[i] = 0, j = 0; j < DIGIT; j++)a[i] = a[i] * 10 + buf[i * DIGIT - 1 - j] - '0';for (; !a[a[0]] && a[0] > 1; a[0]--);if (a[0] == 1 && !a[1]) sgn = 0;return 1;
}
struct bignum {bignum_t num;int sgn;
public:inline bignum() { memset(num, 0, sizeof(bignum_t)); num[0] = 1; sgn = 0; }inline int operator!() { return num[0] == 1 && !num[1]; }inline bignum& operator=(const bignum& a) { memcpy(num, a.num, sizeof(bignum_t)); sgn = a.sgn; return *this; }inline bignum& operator=(const int a) { memset(num, 0, sizeof(bignum_t)); num[0] = 1; sgn = SGN(a); add(num, sgn * a); return *this; };inline bignum& operator+=(const bignum& a) {if (sgn == a.sgn)add(num, a.num); else if (sgn && a.sgn) {int ret = comp(num, a.num); if (ret > 0)sub(num, a.num); else if (ret < 0) {bignum_t t;memcpy(t, num, sizeof(bignum_t)); memcpy(num, a.num, sizeof(bignum_t)); sub(num, t); sgn = a.sgn;}else memset(num, 0, sizeof(bignum_t)), num[0] = 1, sgn = 0;}else if (!sgn)memcpy(num, a.num, sizeof(bignum_t)), sgn = a.sgn; return *this;}inline bignum& operator+=(const int a) {if (sgn * a > 0)add(num, ABS(a)); else if (sgn && a) {int ret = comp(num, ABS(a)); if (ret > 0)sub(num, ABS(a)); else if (ret < 0) {bignum_t t;memcpy(t, num, sizeof(bignum_t)); memset(num, 0, sizeof(bignum_t)); num[0] = 1; add(num, ABS(a)); sgn = -sgn; sub(num, t);}else memset(num, 0, sizeof(bignum_t)), num[0] = 1, sgn = 0;}else if (!sgn)sgn = SGN(a), add(num, ABS(a)); return *this;}inline bignum operator+(const bignum& a) { bignum ret; memcpy(ret.num, num, sizeof(bignum_t)); ret.sgn = sgn; ret += a; return ret; }inline bignum operator+(const int a) { bignum ret; memcpy(ret.num, num, sizeof(bignum_t)); ret.sgn = sgn; ret += a; return ret; }inline bignum& operator-=(const bignum& a) {if (sgn * a.sgn < 0)add(num, a.num); else if (sgn && a.sgn) {int ret = comp(num, a.num); if (ret > 0)sub(num, a.num); else if (ret < 0) {bignum_t t;memcpy(t, num, sizeof(bignum_t)); memcpy(num, a.num, sizeof(bignum_t)); sub(num, t); sgn = -sgn;}else memset(num, 0, sizeof(bignum_t)), num[0] = 1, sgn = 0;}else if (!sgn)add(num, a.num), sgn = -a.sgn; return *this;}inline bignum& operator-=(const int a) {if (sgn * a < 0)add(num, ABS(a)); else if (sgn && a) {int ret = comp(num, ABS(a)); if (ret > 0)sub(num, ABS(a)); else if (ret < 0) {bignum_t t;memcpy(t, num, sizeof(bignum_t)); memset(num, 0, sizeof(bignum_t)); num[0] = 1; add(num, ABS(a)); sub(num, t); sgn = -sgn;}else memset(num, 0, sizeof(bignum_t)), num[0] = 1, sgn = 0;}else if (!sgn)sgn = -SGN(a), add(num, ABS(a)); return *this;}inline bignum operator-(const bignum& a) { bignum ret; memcpy(ret.num, num, sizeof(bignum_t)); ret.sgn = sgn; ret -= a; return ret; }inline bignum operator-(const int a) { bignum ret; memcpy(ret.num, num, sizeof(bignum_t)); ret.sgn = sgn; ret -= a; return ret; }inline bignum& operator*=(const bignum& a) { bignum_t t; mul(t, num, a.num); memcpy(num, t, sizeof(bignum_t)); sgn *= a.sgn; return *this; }inline bignum& operator*=(const int a) { mul(num, ABS(a)); sgn *= SGN(a); return *this; }inline bignum operator*(const bignum& a) { bignum ret; mul(ret.num, num, a.num); ret.sgn = sgn * a.sgn; return ret; }inline bignum operator*(const int a) { bignum ret; memcpy(ret.num, num, sizeof(bignum_t)); mul(ret.num, ABS(a)); ret.sgn = sgn * SGN(a); return ret; }inline bignum& operator/=(const bignum& a) { bignum_t t; div(t, num, a.num); memcpy(num, t, sizeof(bignum_t)); sgn = (num[0] == 1 && !num[1]) ? 0 : sgn * a.sgn; return *this; }inline bignum& operator/=(const int a) { int t; div(num, ABS(a), t); sgn = (num[0] == 1 && !num[1]) ? 0 : sgn * SGN(a); return *this; }inline bignum operator/(const bignum& a) { bignum ret; bignum_t t; memcpy(t, num, sizeof(bignum_t)); div(ret.num, t, a.num); ret.sgn = (ret.num[0] == 1 && !ret.num[1]) ? 0 : sgn * a.sgn; return ret; }inline bignum operator/(const int a) { bignum ret; int t; memcpy(ret.num, num, sizeof(bignum_t)); div(ret.num, ABS(a), t); ret.sgn = (ret.num[0] == 1 && !ret.num[1]) ? 0 : sgn * SGN(a); return ret; }inline bignum& operator%=(const bignum& a) { bignum_t t; div(t, num, a.num); if (num[0] == 1 && !num[1])sgn = 0; return *this; }inline int operator%=(const int a) { int t; div(num, ABS(a), t); memset(num, 0, sizeof(bignum_t)); num[0] = 1; add(num, t); return t; }inline bignum operator%(const bignum& a) { bignum ret; bignum_t t; memcpy(ret.num, num, sizeof(bignum_t)); div(t, ret.num, a.num); ret.sgn = (ret.num[0] == 1 && !ret.num[1]) ? 0 : sgn; return ret; }inline int operator%(const int a) { bignum ret; int t; memcpy(ret.num, num, sizeof(bignum_t)); div(ret.num, ABS(a), t); memset(ret.num, 0, sizeof(bignum_t)); ret.num[0] = 1; add(ret.num, t); return t; }inline bignum& operator++() { *this += 1; return *this; }inline bignum& operator--() { *this -= 1; return *this; };inline int operator>(const bignum& a) { return sgn > 0 ? (a.sgn > 0 ? comp(num, a.num) > 0:1) : (sgn < 0 ? (a.sgn < 0 ? comp(num, a.num) < 0 : 0) : a.sgn < 0); }inline int operator>(const int a) { return sgn > 0 ? (a > 0 ? comp(num, a) > 0:1) : (sgn < 0 ? (a < 0 ? comp(num, -a) < 0 : 0) : a < 0); }inline int operator>=(const bignum& a) { return sgn > 0 ? (a.sgn > 0 ? comp(num, a.num) >= 0 : 1) : (sgn < 0 ? (a.sgn < 0 ? comp(num, a.num) <= 0 : 0) : a.sgn <= 0); }inline int operator>=(const int a) { return sgn > 0 ? (a > 0 ? comp(num, a) >= 0 : 1) : (sgn < 0 ? (a < 0 ? comp(num, -a) <= 0 : 0) : a <= 0); }inline int operator<(const bignum& a) { return sgn < 0 ? (a.sgn < 0 ? comp(num, a.num)>0:1) : (sgn > 0 ? (a.sgn > 0 ? comp(num, a.num) < 0 : 0) : a.sgn > 0); }inline int operator<(const int a) { return sgn < 0 ? (a < 0 ? comp(num, -a)>0:1) : (sgn > 0 ? (a > 0 ? comp(num, a) < 0 : 0) : a > 0); }inline int operator<=(const bignum& a) { return sgn < 0 ? (a.sgn < 0 ? comp(num, a.num) >= 0 : 1) : (sgn > 0 ? (a.sgn > 0 ? comp(num, a.num) <= 0 : 0) : a.sgn >= 0); }inline int operator<=(const int a) { return sgn < 0 ? (a < 0 ? comp(num, -a) >= 0 : 1) : (sgn > 0 ? (a > 0 ? comp(num, a) <= 0 : 0) : a >= 0); }inline int operator==(const bignum& a) { return (sgn == a.sgn) ? !comp(num, a.num) : 0; }inline int operator==(const int a) { return (sgn * a >= 0) ? !comp(num, ABS(a)) : 0; }inline int operator!=(const bignum& a) { return (sgn == a.sgn) ? comp(num, a.num) : 1; }inline int operator!=(const int a) { return (sgn * a >= 0) ? comp(num, ABS(a)) : 1; }inline int operator[](const int a) { return digit(num, a); }friend inline istream& operator>>(istream& is, bignum& a) { read(a.num, a.sgn, is); return is; }friend inline ostream& operator<<(ostream& os, const bignum& a) { if (a.sgn < 0)os << '-'; write(a.num, os); return os; }friend inline bignum sqrt(const bignum& a) { bignum ret; bignum_t t; memcpy(t, a.num, sizeof(bignum_t)); sqrt(ret.num, t); ret.sgn = ret.num[0] != 1 || ret.num[1]; return ret; }friend inline bignum sqrt(const bignum& a, bignum& b) { bignum ret; memcpy(b.num, a.num, sizeof(bignum_t)); sqrt(ret.num, b.num); ret.sgn = ret.num[0] != 1 || ret.num[1]; b.sgn = b.num[0] != 1 || ret.num[1]; return ret; }inline int length() { return ::length(num); }inline int zeronum() { return ::zeronum(num); }inline bignum C(const int m, const int n) { combination(num, m, n); sgn = 1; return *this; }inline bignum P(const int m, const int n) { permutation(num, m, n); sgn = 1; return *this; }
};
//以上为高精度模板
typedef bignum ll;ll x1[10001], x2[10001], x3[10001], tot[10001];//x1为1°烷基个数,x2为2°烷基个数,x3为3°烷基个数,tot为烷基个数之和,序数为碳数
void f_calc_alkyl(int n) {x1[1] = 1; tot[1] = 1;x1[2] = 1; tot[2] = 1;x1[3] = 1; x2[3] = 1; tot[3] = 2;x1[4] = 2; x2[4] = 1; x3[4] = 1; tot[4] = 4;//初始化1到4碳的烷基种类 for (int i = 5; i <= n; i++){x1[i] = tot[i - 1];//计算1°烷基种类 for (int j = 1; j < (i - 1) / 2; j++){x2[i] += tot[j] * tot[i - 1 - j];}if (i % 2)x2[i] += tot[(i - 1) / 2] * (tot[(i - 1) / 2] + 1) / 2;elsex2[i] += tot[i / 2] * tot[i / 2 - 1];//计算2°烷基种类 for (int j = 1; j < i; j++){for (int k = j + 1; k < i; k++){if (i - 1 - j - k > k){x3[i] += tot[j] * tot[k] * tot[i - 1 - j - k];}}}//连接的3个烷基为ABC型 for (int j = 1; j < i && i - 1 - 2 * j>0; j++){if (j != i - 1 - 2 * j)x3[i] += (tot[j] * (tot[j] + 1)) / 2 * tot[i - 1 - 2 * j];}//连接的3个烷基为AAB型 if ((i - 1) % 3 == 0){int tem = (i - 1) / 3;x3[i] += tot[tem] * (tot[tem] + 1) * (tot[tem] + 2) / 6;}//连接的3个烷基为AAA型 //计算3°烷基种类 tot[i] = x1[i] + x2[i] + x3[i];//求和 }
}
//计算烷基个数
bignum f_calc_3(int n) {bignum ans;ans = 0;int ub = (n + 1) / 2;//所连烷基碳数上限 for (int i = 1; i < ub; i++){for (int j = i + 1; j < ub; j++){if (n - i - j > j && n - i - j < ub)ans = ans + tot[i] * tot[j] * tot[n - i - j];}}//烷基为ABC型 for (int i = 1; i < ub; i++){if (n - 2 * i > 0 && n - 2 * i < ub && i != n - 2 * i)ans = ans + (tot[i] + 1) * tot[i] / 2 * tot[n - 2 * i];}//烷基为AAB型 if (n % 3 == 0)ans = ans + tot[n / 3] * (tot[n / 3] + 1) * (tot[n / 3] + 2) / 6;//烷基为AAA型return ans;
}
// 计算中心为3°碳的烷烃个数
bignum f_calc_4(int n) {bignum ans;ans = 0;int ub = (n + 1) / 2;for (int i = 1; i < ub; i++) {for (int j = i + 1; j < ub; j++){for (int k = j + 1; k < ub; k++){if (n - i - j - k > k && n - i - j - k < ub)ans += tot[i] * tot[j] * tot[k] * tot[n - i - j - k];}}}//烷基为ABCD型 for (int i = 1; i < ub; i++) {for (int j = 1; j < ub; j++){if (n - 2 * i - j > j && i != j && i != n - 2 * i - j && n - 2 * i - j < ub)ans += tot[i] * (tot[i] + 1) / 2 * tot[j] * tot[n - 2 * i - j];}}//烷基为AABC型 if (n % 2 == 0) {int tem = n / 2;for (int i = 1; i < tem - i; i++)ans += tot[i] * (tot[i] + 1) / 2 * tot[tem - i] * (tot[tem - i] + 1) / 2;}//烷基为AABB型 for (int i = 1; i <= n && n - 3 * i > 0; i++) {if (i != n - 3 * i && n - 3 * i < ub)ans += tot[i] * (tot[i] + 1) * (tot[i] + 2) / 6 * tot[n - 3 * i];}//烷基为AAAB型 if (n % 4 == 0) {ans += tot[n / 4] * (tot[n / 4] + 1) * (tot[n / 4] + 2) * (tot[n / 4] + 3) / 24;}//烷基为AAAA型 return ans;
}
// 计算中心为4°碳的烷烃个数
bignum f_calc_odd(int n) {bignum ans = tot[n / 2] * (tot[n / 2] + 1) / 2 + tot[n / 2] * (tot[n / 2 + 1] - tot[n / 2]);ans += f_calc_3(n - 1);ans += f_calc_4(n - 1);return ans;
}
bignum f_calc_even(int n) {bignum ans = (tot[n / 2] + 1) * tot[n / 2] / 2;ans += f_calc_3(n - 1);ans += f_calc_4(n - 1);return ans;
}
bignum f_calc(int n) {f_calc_alkyl(n);if (n % 2 == 0)return f_calc_even(n);elsereturn f_calc_odd(n);//分奇偶讨论
}
int main()
{int num;cout << "请输入C原子的个数  " << endl;cin >> num;cout <<endl <<"能构成同分异构体的数目为" << f_calc(num) << endl;
}

输入:C原子的个数

输出:该C原子数目所能构成链结构烷烃同分异构体的数目

烷烃同分异构体数目的计算相关推荐

  1. mysql 前n个最大值_MySQL varchar计算:求列的数目和计算N的最大值

    MySQL varchar计算:求列的数目和计算N的最大值 有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少? 先明白计算的一些规则限制 ① 存储限制 需要额 ...

  2. keras + tensorflow —— 训练参数数目的计算

    1. RNN 模型 Embedding Embedding(input_dim, output_dim,input_length) input_dim 表示字典的大小: outpu_dim 则表示嵌入 ...

  3. 银行提供了整数整存整取定期储蓄业务,其存期分为一年,两年,三年,五年,到期凭存单支取本息,编写一个程序,输入存入的本金数目,计算假设存一年,两年,三年,五年,到期取款时,银行应支付多少本息分别是多少

    public class Test03 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); Sy ...

  4. 蛋白质对中可能相互作用域的数目计算

    预备知识 关于蛋白质对中可能相互作用域的数目的计算这篇论文 Ensemble learning prediction of protein–protein interactions using pro ...

  5. PHP数组函数 count (计算数组中的元素数目)

    在PHP中,数组函数 count () 用来计算数组中的元素数目.     函数语法: count ( mixed $array_or_countable [, int $mode = COUNT_N ...

  6. 【其他】【RQNOJ】同分异构体

    题目描述 化学上,同分异构体是一种有相同化学式,有同样的化学键而有不同的原子排列.同分异构现象广泛存在于有机物中,同分异构体的知识也贯穿于中学有机化学的始终.因此,分析.判断同分异构体也就成为有机化学 ...

  7. 学界 | OpenAI 发布稀疏计算内核,更宽更深的网络,一样的计算开销

    作者:杨晓凡 概要:OpenAI 的研究人员们近日发布了一个高度优化的 GPU 计算内核,它可以支持一种几乎没被人们探索过的神经网络架构:带有稀疏块权重的网络. OpenAI 的研究人员们近日发布了一 ...

  8. 满二叉树各种节点数目的计算

    1. 二叉树的基本性质 二叉树的第i层至多有2i-1个结点(i>=1) 证明:(归纳法) 归纳基:i=1时,只有一个结点,2i-1=20=1: 归纳假设:假设对所有的i命题成立: 归纳证明:二叉 ...

  9. OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配

    直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化 原理 图像的直方图是什么? 直方图是图像 ...

最新文章

  1. 推荐 Python 十大经典练手项目,让你的 Python 技能点全亮!
  2. Kibana——数据图形化制作
  3. java获取内存基址_安卓逆向|菜鸟的FRIDA学习笔记:内存读写
  4. LTM设备上ping不通网关
  5. 天池 在线编程 矩阵还原(前缀和)
  6. php二分法实力,php常见的几种排序以及二分法查找
  7. JDBC连接数据库经验技巧集萃
  8. mysql+keepalived实现双主自由切换
  9. php 受保护的方法调用_PHP_PHP中对用户身份认证实现两种方法,当访问者浏览受保护页面时, - phpStudy...
  10. Hyperion神器之SmartView产品(中篇)
  11. 【标准正态分布查询表】
  12. 从零打造的机械(智能)键盘,超级喜欢,IT人最爱
  13. 通俗易懂说单因素方差分析表
  14. 选择性粘贴HTML,Excel中“选择性粘贴”的五种特殊用法
  15. 国际反垃圾邮件组织有哪些?
  16. linux刷新率设置命令,linux修改屏幕刷新率
  17. 计算机保存到桌面没有显示,电脑系统进不去桌面,没有图标怎么办?
  18. Ubuntu20.04 安装ROS2 Foxy
  19. wkhtmltopdf 字体无效问题
  20. 移动互联网的本质(信息换能量)

热门文章

  1. 概率论 思维导图复习提纲
  2. G - A/B Matrix CodeForces - 1360G
  3. 第四篇:coalesce 和repartition 在shuffle 和并行度之间的选择(spark2.3持续更新中...........)
  4. chrome android 中文版下载,谷歌chrome安卓版中文
  5. Workflow Pattern
  6. [待续]联想ThinkPadE420升级之路:英睿达(Crucial)MX500+XP开启AHCI模式+64位win10
  7. PDF文件太大怎么压缩?用这个方法能够一键瘦身
  8. 关于EBGP用回环口起邻居遇到的问题
  9. 【C++】迭代器、反向迭代器详解
  10. 微信DAT文件解密(dat转图像)