时间与空间不可得兼。。我选择空间。。空间复杂度还是很低的。。
#include <stdio.h>
int shi(int n){
return (n>0)?shi(n=n>>1)+1:0;
}
void turnb(int n){
if(n!=0){
turnb(n>>1);
printf("%d",n&1);
}
}
int convertBinaryToDecimal(long long n)
{
int decimalNumber = 0, i = 0, remainder;
while (n>0)
{
remainder = n%10;
n /= 10;
decimalNumber += remainder*(1<<i);
++i;
}
return decimalNumber;
}
int mod(int n,int k){
int lenn=shi(n),lenk=shi(k);
n=n<<(lenk-1);
k=k<<(lenn-1);
int m=0;
int midlen;
int reg=n;
for(;;){
reg=reg^k;
midlen=shi(reg);
if(midlen<lenk)break;
k=k>>(shi(k)-midlen);
}
return reg;
}
int main(int argc, char** argv){
long long n,k;
int nl,kl;
while(1){
printf("输入要发送的数据:");
scanf("%lld",&n);
printf("输入CRC生成多项式:");
scanf("%lld",&k);
printf("CRC校验码为:");
nl=convertBinaryToDecimal(n);
kl=convertBinaryToDecimal(k);
int r=mod(nl,kl);
turnb(r);
printf("\n最终的发送数据为:");
nl=nl<<(shi(kl)-1);
nl=nl^r;
turnb(nl);
printf("\n\n");
}
return 0;
}