哪位有一定基础的有件事帮忙看下除法怎么出问题了吧 谢谢了 调试了很久没找到错 - -
#include<stdio.h>#include<string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <malloc.h>
#define MAX 10 //最高位标记长度
void GiveNum( int a[])
{
int i;
a[MAX-1]=MAX-1;
a[MAX-2]=1;
for(i=0;i<MAX-2;i++)
a[i]=rand()%10;
}
void OutputNum( int a[],int n)
{
int i;
printf("%d\t",a[n-1]); //输出长度
for(i=n-2;i>=0;i--)
{
printf("%d",a[i]);
}
printf("\n");
}
void mov(int a[],int *b) //复制
{
int i ;
for(i=0;i<MAX;i++)
b[i]=a[i];
return;
}
int cmp(int a[],int *b) //比较大小
{
int i;
if(a[MAX-1]>b[MAX-1])return 1;
else if(a[MAX-1]<b[MAX-1])return -1;
else
{
for(i=MAX-2;i>0;i--)
{
if(a[i]>b[i])
{
return 1;
break;
}
if(a[i]<b[i])
{
return -1;
break;
}
}
return 0;
}
}
void AddNum( int a[], int b[], int *c) //两数相加
{
int i,j;
c[MAX-2]=a[MAX-2]+b[MAX-2];
for(i=MAX-3;i>=0;i--)
{
c[i]=a[i]+b[i];
if(c[i]>=10)
{
c[i+1]++;
c[i]=c[i]-10;
};
}
for(j=MAX-2;j>=0;j--){
for(i=MAX-2;i>=0;i--)if(c[i]>=10) //复查MAX-1次,防止C[i]为9后c[i-1]位进位
{
c[i+1]++;
c[i]=c[i]-10;
};}
c[MAX-1]=a[MAX-1]; //最高位大小固定
}
void sub(int a[],int b[],int c[])
{
int i;
int j=MAX-1;
int p,q;
for(i=MAX-2;i>=0;i--)
{
c[i]=a[i]-b[i];
}
for(i=0;i<MAX-2;i++) //借位
{
if(c[i]<0)
{
c[i+1]--;
c[i]=10+c[i];
}
}
if(a[MAX-1]!=b[MAX-1])c[MAX-1]=a[MAX-1]; //算c[]的长度
else
{
p=0;q=c[MAX-2];
while(q==0)
{
p++;
q=c[MAX-2-p];
}
c[MAX-1]=MAX-1-p;
}
}
void mul(int a[],int b[],int *c)
{
int i,j,x,y,z,w;
for(i=0;i<MAX-1;i++)
{
for(j=0;j<MAX-1;j++)
{
x=a[i]*b[j];
y=x/10;
z=x%10;
w=i+j;
c[w]=c[w]+z; //w=15. i=5,j=10 or i=10,j=5 or i=7,j=8.......
c[w+1]=c[w+1]+y+c[w]/10;
c[w]=c[w]%10;
}
}
c[2*MAX-1]=2*MAX-2; //最高位大小固定
return;
}
void mod(int a[MAX],int b[MAX],int *c)/*/c=a mod b//注意:经检验知道此处A和C的数组都改变了。*/
{ int d[MAX];
mov (a,d);
while (cmp(d,b)!=(-1))/*/c=a-b-b-b-b-b.......until(c<b)*/
{
sub(d,b,c);
mov(c,d);/*/c复制给a*/
}
int p,q;
p=0;q=c[MAX-2]; //算C的长度
while(q==0)
{
p++;
q=c[MAX-2-p];
}
c[MAX-1]=MAX-1-p;
return ;
}
void divt(int t[MAX],int b[MAX],int *c ,int *w)/*//试商法//调用以后w为a mod b, C为a div b;*/
{
int a1,b1,i,j,m;/*w用于暂时保存数据*/
int d[MAX],e[MAX],f[MAX],g[MAX],a[MAX];
mov(t,a);
for(i=0;i<MAX;i++)
e[i]=0;
for(i=0;i<MAX;i++)
d[i]=0;
for(i=0;i<MAX;i++) g[i]=0;
a1=a[MAX-1];
b1=b[MAX-1];
if (cmp(a,b)==(-1)) //a<b的情况
{
c[0]=0;
c[MAX-1]=1;
mov(t,w);
return;
}
else if (cmp(a,b)==0) //a=b的情况
{
c[0]=1;
c[MAX-1]=1;
w[0]=0;
w[MAX-1]=1;
return;
}
m=(a1-b1);
for(i=MAX;i>=0;i--)/*341245/3=341245-300000*1--->41245-30000*1--->11245-3000*3--->2245-300*7--->145-30*4=25--->25-3*8=1*/
{
for(j=0;j<MAX;j++)
d[j]=0;
d[i]=1;
d[MAX-1]=i+1;
mov(b,g);
mul(g,d,e);
while (cmp(a,e)!=(-1))
{
c[i]++;
sub(a,e,f);
mov(f,a);/*f复制给g*/
}
for(j=i;j<MAX;j++)/*高位清零*/
e[j]=0;
}
mov(a,w);
if (c[m]==0) c[MAX-1]=m;
else c[MAX-1]=m+1;
return;
}
void main()
{
int a[MAX];
int b[MAX];
int c[MAX];
int d[MAX*2]={0};
int e[MAX]={0};
int f[MAX]={0};
int i;
GiveNum(a);
GiveNum(b);
OutputNum(a,MAX);
printf("\n");
printf("\n");
OutputNum(b,MAX);
printf("\na-b:");
sub(a,b,c);
OutputNum(c,MAX);
printf("\na mod b:");
mod(a,b,c);
OutputNum(c,MAX);
divt(a,b,e,f);
printf("\na / c:\n");
OutputNum(e,MAX);
printf("\na mod c:\n");
OutputNum(f,MAX);
}
说明:程序用于实现大于长整形的数字的加、减、乘、除、模除 思路是用数组表示大数 对数组做处理达到目的效果
mov函数是拷贝一个数 cmp是比较两个数的大小 add sub mul divt mod 对应加减乘除模除 所有的运算都没有问题 就是除法出问题了 编译不报错 但是运行无结果