标题:哪位有一定基础的有件事帮忙看下除法怎么出问题了吧 谢谢了 调试了很久没找 ...
只看楼主
sd791002
Rank: 2
等 级:论坛游民
帖 子:88
专家分:87
注 册:2010-4-3
结帖率:85.71%
已结贴  问题点数:20 回复次数:8 
哪位有一定基础的有件事帮忙看下除法怎么出问题了吧 谢谢了 调试了很久没找到错 - -
#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  对应加减乘除模除     所有的运算都没有问题 就是除法出问题了  编译不报错 但是运行无结果
搜索更多相关主题的帖子: 基础 调试 除法 
2010-04-14 21:58
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
得分:0 
看着头就晕。。。
  
while (cmp(a,e)!=(-1))
  {
   c[i]++;
   sub(a,e,f);
   mov(f,a);/*f复制给g*/
  }
这里会死。。。为什么会死~~~我看不下去了~~~~除法部分加多点注释吧
2010-04-14 22:17
sd791002
Rank: 2
等 级:论坛游民
帖 子:88
专家分:87
注 册:2010-4-3
得分:0 
我错了。。。在c里看的还是蛮清楚的  也可能是我自己写的缘故 不好意思  除法的马上再上点注释~
2010-04-14 22:32
sd791002
Rank: 2
等 级:论坛游民
帖 子:88
专家分:87
注 册:2010-4-3
得分:0 
while (cmp(a,e)!=(-1))
  {
   c[i]++;
   sub(a,e,f);
   mov(f,a);/*f复制给g*/
  }
这个可以以11245/3000为例  a=11245(除数)  e=3000(后面的0在上一步给出 第【i】位)
a>e  c[i]就+1 a=a-e    一次循环结束
一直到c=3  这时候a=a-e-e-e=11245-3000*3<e
所以除数的i位就确定了  (c[i])    然后确定除数的i-1位        


for(i=MAX;i>=0;i--)/  这个循环  一次循环确定一次除数的i位的数值 最后一次循环确定余数
2010-04-14 22:42
sd791002
Rank: 2
等 级:论坛游民
帖 子:88
专家分:87
注 册:2010-4-3
得分:0 
除法的思想是试商法
比如除数是341245  被除数是3  那么
341245/3=341245-300000*1--->41245-30000*1--->11245-3000*3--->2245-300*7--->145-30*4=25--->25-3*8=1
c[i]就分别是 1 1 3 7 4 8        余1
2010-04-14 22:44
sd791002
Rank: 2
等 级:论坛游民
帖 子:88
专家分:87
注 册:2010-4-3
得分:0 
其实前面的算法都可以不用看  已经验证是对的了 。。。 关键是出发运行不了
2010-04-14 22:46
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
得分:20 
我只能说只是你的思路是对的。但实现上某个地方错了。我没有太多时间去理解的你程序,你的除法那不是运行不了,而是进了while出不来,
while (cmp(a,e)!=(-1))
  {
   c[i]++;
   sub(a,e,f);
   mov(f,a);/*f复制给g*/
  }
你可以自己在这循环里面设置断点看看,进入循环后,e的元素全为零。
再调试下试试。如果不急的话可以过两天我帮你。
2010-04-15 00:50
sd791002
Rank: 2
等 级:论坛游民
帖 子:88
专家分:87
注 册:2010-4-3
得分:0 
万分感谢  昨天班上去春游了 没来看~      大神 我等您~~
2010-04-16 19:06
sd791002
Rank: 2
等 级:论坛游民
帖 子:88
专家分:87
注 册:2010-4-3
得分:0 
我找到了两个错误 分别是乘法结尾没有计算长度和除法里大的for循环i的出示值错误  现在已经能进行两个长度相等的数相除了 但是长度不等的数貌似还运行不了。。。
感谢7楼激起了我自己的调试欲,,,,拜谢!

继续找问题ING
2010-04-16 22:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-303028-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.306993 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved