?? verify.c
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void perr(char *);
unsigned long encode();
int cmp();
int *sub();
int *tz();
unsigned long mu();
int *mn();
int *chu();
int *multi();
char filename[100];
char newfile[100];
char pkfile[100];
FILE *fp;
FILE *nfp;
FILE *kfp;
char n[20];
char k[20];
main(argc,argv)
int argc; char **argv;
{ char block[20];
unsigned long x=0;
long num=0,p,i=0;
char ch;
int r;
if(argc>3||argc==2) perr("Usage: verify [filename] [skfile]");
if(argc==3) {strcpy(filename,argv[1]);strcpy(pkfile,argv[2]);}
else
{
printf("\nEnter filename needing verifying: "); gets(filename);
printf("\nEnter your pkfile: ");gets(pkfile);
}
if((fp=fopen(filename,"r"))==NULL) perr("Can't open file!");
strcpy(newfile,filename);
while(newfile[i]!='\0')
{i=i+1;}
ch=fgetc(fp);
newfile[i-1]=ch;
if((kfp=fopen(pkfile,"r"))==NULL) perr("Can't open file!");
if((nfp=fopen(newfile,"w+"))==NULL) perr("Can't creat new file!");
fscanf(kfp,"%s %s",n,k);
printf("\nn=%s,k=%s\n",n,k);
fclose(kfp);
fscanf(fp,"%u;",&num);
printf("num=%u",num);
fgetc(fp);
r=num%3;
p=(num-r)/3;
i=0;
while(i<p)
{i=i+1;
fread(block,20,1,fp);
block[20]='\0';
printf("block=%s",block);
x=encode(block);
fwrite(&x,3,1,nfp);
}
if (r!=0)
{
fread(block,20,1,fp);
block[20]='\0';
x=encode(block);
fwrite(&x,r,1,nfp);
r=0;
}
fclose(fp);
fclose(nfp);
}
void perr(s)
char *s;
{
printf("\n%s",s); exit(1);
}
unsigned long encode(char blo[20])
{int i;
int b[40];
static int u[40];
int a[40];
int c[40];
unsigned long x=0;
for(i=0;i<20;i++)
{ a[i]=blo[i]-48;
b[i]=k[i]-48;}
for(i=20;i<40;i++){a[i]=0;b[i]=0;}
for(i=0;i<40;i++)c[i]=0;c[0]=1;
while(cmp(b,u))
{
while ((b[0]%2)==0)
{
chu(b,2);
mn(a,a);
}
b[0]--;
mn(c,a);
}
printf("x=");
for(i=19;i>=0;i--)
{ x=x*10+c[i];printf("%d",c[i]);}
return (x);
}
int *mn(int c[40],int a[40])
{int i;
unsigned long d=0;
int m[40];
int x[40],y[40];
for(i=0;i<20;i++)
{x[i]=n[i]-48;
y[i]=n[i]-48;
}
x[10]++;
for(i=20;i<40;i++){x[i]=0;y[i]=0;}
for(i=17;i>=10;i--){d=x[i]+d*10;}
multi(c,a);
while(cmp(c,x)){
for(i=10;i<40;i++)m[i-10]=c[i];
for(i=30;i<40;i++)m[i]=0;
chu(m,d);
multi(m,y);
sub(c,m);
}
while(cmp(c,y))
{sub(c,y);
return(c);}
}
int *multi(int n2[40],int n1[40]) /*乘法++*/
{int i;
int mul[40];
int a,b;
for(i=0;i<40;i++)mul[i]=0;
for(a=0;a<20;a++)
{
for(b=0;b<20;b++)
{
mul[a+b]=mul[a+b]+n2[b]*n1[a];
}
}
tz(mul);
for(a=0;a<40;a++)
{n2[a]=mul[a];}
return(n2);}
int *tz(int *mut) /*調整數組++*/
{
int a,b,bi,i;
for(a=0;a<40;a++)
{
i=0;
b=mut[a];
mut[a]=mut[a]%10;
while(b)
{
i++;
b=b/10;
bi=b%10;
mut[a+i]+=bi;
}
}return(mut);
}
int cmp(int *n1,int *m) /*比較 */
{
int i=39;
while(n1[i]==m[i])
{
i--;
}
if(i<0)return 0;
else if(n1[i]>m[i])
return 1 ;
else
return 0 ;
}
int *chu(int *m,unsigned long d ) /*除法*/
{unsigned long w1=0;
int i,a;
int u[40];for(i=0;i<40;i++)
u[i]=0;
for(a=29;a>=0;a--)
{w1=w1*10+m[a];
u[a]=w1/d;
w1=w1%d;
}
for(a=29;a>=0;a--)
m[a]=u[a];
return(m);
}
int *sub(int c[40],int q[40]) /*減法++*/
{
int i,t;
for(i=0;i<40;i=i++)
{if(c[i]>=q[i])
c[i]=c[i]-q[i];
else
{
c[i]=c[i]+10-q[i];
t=1;
while(c[i+t]==0){
c[i+t]=9; t++;}
c[i+t]--;}
}
return(c); }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -