```ts
/**
 * Splits takings among partners based on their weights.
 * @param total - The total takings in whole cents.
 * @param weights - An array of partner weights.
 * @returns An array of parts each partner receives.
 */
export function splitCents(total: number, weights: number[]): number[] {
  if (!Number.isInteger(total) || total < 0) {
    throw new Error('Invalid total');
  }
  if (!Array.isArray(weights) || weights.length === 0) {
    throw new Error('Invalid weights');
  }
  if (weights.some(weight => !Number.isInteger(weight) || weight <= 0)) {
    throw new Error('Invalid weights');
  }

  const sumWeights = weights.reduce((acc, weight) => acc + weight, 0);
  const parts = weights.map(weight => Math.floor(total * weight / sumWeights));
  let remainingCents = total - parts.reduce((acc, part) => acc + part, 0);

  while (remainingCents > 0) {
    const maxIndex = parts.findIndex(part => part < Math.ceil(total * weights[parts.indexOf(part)] / sumWeights));
    if (maxIndex === -1) break;
    parts[maxIndex]++;
    remainingCents--;
  }

  return parts;
}
```