两个程序用了同一个算法,结果一个没错,一个输出有错。
程序代码:
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> int r[5]; /*************多项式相乘模块****************/ void pmul(int k[],int x,int t[],int y,int n[],int z) { int i,j; for(i=0;i<z;i++) n[i]=0; for(i=0;i<x;i++) for(j=0;j<y;j++) n[i+j]=n[i+j]+k[i]*t[j]; return; } /*************多项式相除模块**************/ void pdiv(int n[],int x,int m[],int y,int r[],int l) { int i,k; for(i=x-1;i>=0;i--) if(n[i]!=0) { k=i; printf("%d\n",k); break; } while(k>=5) { for(i=k;i>=k-5;i--) { n[i]=n[i]^m[y-1-k+i]; } for(i=k;i>=k-5;i--) if(n[i]!=0) { k=i; // printf("%d\n",k); break; } } for(i=l-1;i>=0;i--) r[i]=n[i]; return; } void main() { int i; char flag='Y'; while(flag=='Y') { int n[15];//整个码长,用于存放多项式相乘后各项的系数. int k[10];//信息码系数数组. int t[6]={0,0,0,0,0,1};//与信息码多项式相乘的多项式的各项的系数,即x^5. FILE *fp; fp=fopen("a.txt","w"); srand(time(0)); printf("The Cofficient of the information code is: \n"); for(i=0;i<10;i++) { k[i]=rand()%2; printf("%d",k[i]); } printf("\n"); pmul(k,10,t,6,n,15);//多项式相乘模块的调用. printf("The Cofficient of the total code is: \n"); for(i=0;i<15;i++) { printf("%d",n[i]); fprintf(fp,"%d",n[i]); } fprintf(fp,"\n"); printf("\n"); fclose(fp); int m[6]={1,0,1,0,1,1}; // static int r[5]; pdiv(n,15,m,6,r,5);//多项式相除模块的调用. printf("The Cofficient of the array r is: \n"); for(i=0;i<=4;i++) printf("%d",r[i]); printf("\n"); /**********将文件中的数据读出来**********/ fp=fopen("a.txt","rb"); printf("The Cofficient that we read from the file is: \n"); // fscanf(fp,"%s",n);//读出文件中的二进制代码. for(i=0;i<15;i++) { if(fscanf(fp,"%c",&n[i])==EOF)//改为每次读出一个字符. break; printf("%c",n[i]);//同样以字符格式输出. } printf("\n"); for(i=0;i<15;i++) { n[i]=n[i]-48;//将字符型转换成整形. printf("%d",n[i]); } printf("\n"); fclose(fp); /**********将余多项式中的各项系数赋值给信息多项式中的系数************/ for(i=0;i<=4;i++) n[i]=r[i]; printf("The Cofficient that we need lastly is: \n"); for(i=0;i<15;i++) printf("%d",n[i]); printf("\n\n"); printf("Do you want to continue?If yes,press Y,if not,press N.\n"); scanf("%c",&flag); getchar(); if(flag=='Y') continue; else break; } }这个程序输出结果是正确的。
程序代码:
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> int s[5]; void pdiv(int n[],int x,int m[],int y,int s[],int z) { int i,k; for(i=x-1;i>=0;i--) if(n[i]!=0) { k=i; printf("%d\n",k); break; } while(k>=5) { for(i=k;i>=k-5;i--) { n[i]=n[i]^m[y-1-k+i]; } for(i=k;i>=k-5;i--) if(n[i]!=0) { k=i; // printf("%d\n",k); break; } } for(i=z-1;i>=0;i--) s[i]=n[i]; return; } void main() { int i; int n[15]; int m[6]={1,0,1,0,1,1}; srand(time(0)); /***********随机产生接收到的码组**********/ for(i=0;i<14;i++) { n[i]=rand()%2; printf("%d",n[i]); } printf("\n"); int s[5]; pdiv(n,15,m,6,s,5); printf("************\n"); for(i=0;i<=4;i++) printf("%d",s[i]); printf("\n"); }而这个结果输出有误,这两个程序都用到了多项式相除模块。求指教……