考中程请注意:特大发现,《程序员教程》中有错误,好像!!!???

yonge23 2003-09-21 10:01:02
《程序员教程》中好像有错啊,今晚发现了!!!

《程序员教程》PAGE333中,

[函数]长整数除普通整数函数
用数组a[]存储K位长整数m: m=a[k]*10^(k-1)+a[k-2]*10^(k-2)+```+a[1]*10^0
a[0]=k
长整数除普通整数运算函数divint(int *a,int j)实现将存于a中的长整数除普通整数j,并将商存于a中,函数返回整除后的余数。
(formal函数是让存储整数的数组的每个元素只存储长整数的一位数字)

int divint(int *a,int j)
{ int p,k;
k=p=a[0]; a[0]=0;
while(p>0){
a[p-1]+=a[p]%j*10;
a[p]=a[p]/j;
if(a[k]==0)k--;
p--;
}
p=a[0]; ————————>我觉得这步应该是:p=a[0]/10
a[0]=k;
formal(a);
return p;
}



请大虾指点!!!
...全文
37 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
yonge23 2003-09-29
  • 打赏
  • 举报
回复
哈哈!
cx1981 2003-09-29
  • 打赏
  • 举报
回复
我想formal函数是完全不必要加的,也不存在什么保险一说,如果真的是起保险作用的话,那formal函数就应该在作除法的过程当中加,否则像这个程序加在最后,等除法都做完了再来规整,那是一点作用也没有的
tyingzi 2003-09-29
  • 打赏
  • 举报
回复
确实有错. p=a[0];应改为p=a[0]/10;
formal()函数调用没有必要.
MPU 2003-09-29
  • 打赏
  • 举报
回复
找了半天,还是找不到不用formal(longNum);会出错的参数.

除法确实如你们所说,不会破坏结构.

不过用formal(longNum);是保险一些.

yonge23 (东方一剑) 看书比我认真多了 ^_^ ....(这错误也发现了!)
MPU 2003-09-29
  • 打赏
  • 举报
回复
//测试程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//输入长整数,存于数组中,a[0]为长整数位数
#define MAXN 400
int readMaxInt(int* a)
{
int len,i;
char s[MAXN];
printf("Inter long interger:\n");
scanf("%s",s);
len = strlen(s);
for ( i = len; i >= 1;i--)
a[i] = s[len-i] - '0';

return a[0] = len;
}

void writeMaxInt(int* a)
{
int i;
for ( i = *a;i >= 1;i-- )
printf("%d ",a[i]);
printf("\n");
}

int divInt(int* a,int j)
{
int p,k;
k = p = a[0]; a[0] = 0;
while ( p > 0 )
{
a[p-1]+=a[p]%j*10;
a[p] = a[p]/j;
if ( a[k] == 0)
k--;
p--;
}
p = a[0];/////////////////////////////////////////
a[0] = k;

return p;
}

void main()
{
int longNum[4];

printf("\nNumber: %d\n\n",readMaxInt(longNum));

writeMaxInt(longNum);

printf("\n%d ",divInt(longNum,8));
printf("\n");

writeMaxInt(longNum);
}
yonge23 2003-09-28
  • 打赏
  • 举报
回复
老实人:

你说得好像没错啊!

因为a[p]=a[p]/j结果只能是0~9十个数字中的某一个.
a[p]是由前一次循环a[p-1]+=a[p]%j*10计算得出的!!!

由于a[p-1]+=a[p]%j*10得出的值不可能超过10*j!!!
这导致下一次循环的a[p]=a[p]/j结果只能是0~9十个数字中的某一个.
所以,在这里用formal(a)好像没什么必要,不过,也不影响结果,可能是像奋斗ing所说的是一个良好的编程习惯.
cx1981 2003-09-28
  • 打赏
  • 举报
回复
这个除法程序和我们平时手工算除法差不多的,每次算出1位商的值只可能是0-9之间的,不可能大于10的啊
chinaJeff 2003-09-28
  • 打赏
  • 举报
回复
除法也有啊,你一步一步算一下就知道了。
chinaJeff 2003-09-28
  • 打赏
  • 举报
回复
老实人:
不好意思,这道题我看过好久了,所以也没再看清楚就说除法也
会破坏结构,今天再看了一下,除法确实是如你所说不会破坏结构
的.
cx1981 2003-09-27
  • 打赏
  • 举报
回复
似乎只有做长整数的加法和乘法时会出现你所说的结构被破坏的情况,除法应该没有这种情况啊~~~
chinaJeff 2003-09-27
  • 打赏
  • 举报
回复
to 老实人:
我说的数据一致性就是说a数组原来是以每个位上存放0-9中
的一个数来组合表示一个较长的整数,而函数在调用过程中可能
会破坏这种结构,如某一位上存储了一个两位数,而没有向前进位,
这样在以后再引用a数组就会出现错误,所以最后用formal(a)也就
是消除这样一个问题,虽然与函数本身求余数的功能无关,但
这是一个良好的编程习惯。
yonge23 2003-09-27
  • 打赏
  • 举报
回复
你还真别说考试没问题哦,我还真怕这次考试,我觉得我准备得好不充分啊,好多都没念啊,上午的内容又多,下午的程序又难!!!

考试啊,命苦啊!!!
thefirstwind 2003-09-27
  • 打赏
  • 举报
回复
很多书都有错误!不是设计的问题,可能是校对和排版的问题,你能把错误都看出来,那你考试就没有问题了
yonge23 2003-09-27
  • 打赏
  • 举报
回复
,至于最后为什么要用formal(a),

我发表一下我的观点:
本来是用数组a[]存储K位长整数m,也就是说数组a[]中的一个元素存放着长整数m一位数,原则上说就是数组a[]中的每一个元素存放着0~9十个数字中的某一个.
但是在某些运算过程中可能会导致数组a[]中的元素存放的数据不是0~9十个数字中的某一个,这时就要用formal函数来规整数组a[],使之满足:用数组a[]存储K位长整数m,而且数组a[]中的每一个元素存放着0~9十个数字中的某一个,即题目的数据类型.

应该是这样子说的吧!!!
请大虾指点.
还有,这个这么简单的程序,至于测试程序就不要贴出来了吧,再说我这人很懒,也没去测试,不过,错误好像是显而易见的啊!!!
MPU 2003-09-27
  • 打赏
  • 举报
回复
把你们的测试程序贴出来看看好吗!!!!!!!!!!!!!!!

cx1981 2003-09-27
  • 打赏
  • 举报
回复
===>>楼上的"维护数据的一致性而已"是什么意思啊??
我把formal()函数的定义贴出大家参考参考~
长整数规整函数formal()
上百位的长整数可以简单的用数组来存储,数组的每个元素顺序存储长整数的1位数字,a[0]存储的是长整数的位数,a[1]存储的是长整数的个位数,a[2]存储的是长整数的十位数...a[k]存储的是长整数的最高位,但在长整数运算时,会使存储中间结果的长整数数组元素的值大于9,这时,就要用规整函数将存储它的数组的每个元素只存储长整数的1位数字
int formal(int *a)
{ int p;
for(p=1;p<a[0]||a[p]>=10;p++) {
if(p>=a[0]) a[p+1]=0;
a[p+1]+=a[p]/10;
a[p]=a[p]%10;
}
if(p>a[0]) a[0]=p;
return a[0];
}
chinaJeff 2003-09-27
  • 打赏
  • 举报
回复
我也支持东方一剑的观点,至于最后为什么要用formal(a),我想并不是功能
上要求这样,只是为了维护数据的一致性而已。
cx1981 2003-09-27
  • 打赏
  • 举报
回复
支持东方一剑的观点,我也把程序调试了一下,确实是返回的余数是正确值的10倍~~
cx1981 2003-09-27
  • 打赏
  • 举报
回复
我觉得这个程序里规整函数formal(a);好像不必要用啊,各位觉得呢?
Hiei1234 2003-09-24
  • 打赏
  • 举报
回复
不可理喻,自己看看书好好理解一下
加载更多回复(4)

2,948

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧