#include <stdio.
h>
#include <string.h>
#define MAX 100
// Perform XOR between dividend and divisor
void xorOperation(char *dividend, char *divisor, int keyLen) {
   for (int i = 1; i < keyLen; i++) {
      dividend[i] = (dividend[i] == divisor[i]) ? '0' : '1';
   }
}
// Compute CRC remainder
void computeCRC(char *data, char *key, char *remainder) {
   int dataLen = strlen(data);
   int keyLen = strlen(key);
   char temp[MAX];
    // Append n-1 zeros to the data
    strcpy(temp, data);
    for (int i = 0; i < keyLen - 1; i++) {
       temp[dataLen + i] = '0';
    }
    temp[dataLen + keyLen - 1] = '\0';
    strncpy(remainder, temp, keyLen);
    remainder[keyLen] = '\0';
    for (int i = 0; i < dataLen; i++) {
       if (remainder[0] == '1') {
           xorOperation(remainder, key, keyLen);
       } else {
           xorOperation(remainder, "0000000000000000", keyLen);
       }
        for (int j = 0; j < keyLen - 1; j++) {
           remainder[j] = remainder[j + 1];
        }
        remainder[keyLen - 1] = temp[i + keyLen];
    }
}
// Receiver side: verify received data
int checkCRC(char *received, char *key) {
   char remainder[MAX];
   computeCRC(received, key, remainder);
    // If remainder is all zero, no error
    for (int i = 0; i < strlen(key) - 1; i++) {
        if (remainder[i] != '0') {
            return 0; // Error found
        }
    }
    return 1; // No error
}
int main() {
   char data[MAX], key[MAX], transmitted[MAX], crcRemainder[MAX];
    printf("Sender Side:\n");
    printf("Enter data (binary): ");
    scanf("%s", data);
    printf("Enter key (generator polynomial in binary): ");
    scanf("%s", key);
    // Sender side CRC calculation
    computeCRC(data, key, crcRemainder);
    // Append CRC to data
    strcpy(transmitted, data);
    strcat(transmitted, crcRemainder);
    printf("\nTransmitted Data (Data + CRC): %s\n", transmitted);
    // Receiver side
    printf("\nReceiver Side:\n");
    char received[MAX];
    printf("Enter received data: ");
    scanf("%s", received);
    if (checkCRC(received, key)) {
        printf("No error detected. Data received correctly.\n");
    } else {
        printf("Error detected in received data!\n");
    }
    return 0;
}