几位版主 ,看在我都问啦 3个100分的 份上 还是帮看看下面的程序吧

宙斯之神 2006-12-15 10:15:23
这个程序我真的调不出来啦,而且很急,就想实现大数的除法运算,带小数点的.
http://www.programfan.com/club/showbbs.asp?id=4155
多谢啦.
这是我改的main 函数
void main()
{

char scan1[20], scan2[20];
char *p;
printf("first = ");
gets(scan1);
printf("second=");
gets(scan2);
cdel0(scan1);
cdel0(scan2);
printf("%s", p=sdivf(scan1, scan2, 30));

}
因为开始运行正确过好多次,可是后来就不知道怎么始终不对啦.
我想算法可能没问题 是不是我调用的时候出的问题那?
多谢各位啦!真的很急
...全文
605 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
宙斯之神 2006-12-18
  • 打赏
  • 举报
回复
多谢各位 !
Jamesonang 2006-12-18
  • 打赏
  • 举报
回复
代码写的让人很难轻松的看懂。。。

不过,给你个参考,如果你真的要写大数操作的话。

GNU MP 是一个开源的实现,http://www.swox.com/gmp/

lockhall 2006-12-17
  • 打赏
  • 举报
回复
牛x!我飘过~
宙斯之神 2006-12-17
  • 打赏
  • 举报
回复
十分感谢,
那是不是我写的那个main函数,在输入了之后就没有调用那个 cchkdig(char *r)函数把,
也就是可以算小数的,只不过结果可能不对, 我就是奇怪,为什么一开始的时候它会按照我写的main函数,在输入了 那么多组测试小数数据的时候给出了精确的结果,而就在我不小心改了某个地方后(我忘记改动哪里啦) 就再也不正确啦, 我确定我只改过main函数 和头文件(头文件忘记最初是怎么用的啦).如果它一直没得出来过正确的结果我也就不再追问啦,就是那一开始的好多组测试数据让我 耿耿于怀.呵呵
jixingzhong 2006-12-17
  • 打赏
  • 举报
回复
很遗憾的是,
这个算法,
操作数只支持 大整数, 虽然结果可以出现小数 ...

看其除法过程,
没有对 小数点 处理,
不能有小数点存在, 自然不能对付 大浮点数。

而且,
这个 校验函数也可以看出来:
int cchkdig(char *r)
{
int i=0;
while(r[i]!='\0')
{
if(isdigit(r[i++])==0)//数据中必须是全部为数字,也就是没有小数点等,就是只支持大整数
return (0);
}
return (1);
}
宙斯之神 2006-12-17
  • 打赏
  • 举报
回复
非常感谢, 用你的方法我运行出来了原程序,但是好像只能算被除数,除数为整数的除法,
可是我想要下面这样的main()函数
void main()
{

char scan1[20], scan2[20];
char *p;
printf("first = ");
gets(scan1);
printf("second=");
gets(scan2);
cdel0(scan1);
cdel0(scan2);
printf("%s", p=sdivf(scan1, scan2, 30));

}
用了上面的main函数我开始可以运行,动态的输入数据,而且小数也可以算出来,可是后来就不知道哪里出了问题,结果就始终都算不正确了,不是里面结果带点特殊符号,就是结果差点!实在是弄不懂啦
jixingzhong 2006-12-17
  • 打赏
  • 举报
回复
楼主,
说说你的问题是什么?

值出来了,
然后结果不正确?
还是程序异常?

说明一下问题可好?
包括你的运行方式、参数 ....
【回复后给我的短消息,帖子链接也发一下,可能找不到帖子 呵呵】
Kevin_jun 2006-12-17
  • 打赏
  • 举报
回复
3ks,mark
laiwusheng 2006-12-16
  • 打赏
  • 举报
回复
回答的好,mark
趋势明道 2006-12-16
  • 打赏
  • 举报
回复
小时候写的一个字符串除法程序,实现了任意实数除法,精确到小数点后任意位(需要修改程序)

tc2 下面编译运行通过

运行方法:

divide number1 number2 > result.txt

结果存在运行目录的result.txt中
趋势明道 2006-12-16
  • 打赏
  • 举报
回复
#define PRECISION 200 /*精确位数*/
#define RANGE 5000 /*预定义的最长整数 */

void shift(char *str,int weishu);
void divide(char *beichushu,char *chushu,char *r);
void multiply(const char *dividend,const char *divisor,char *r);
void subtract(const char *dividend,const char *divisor,char *r);
int convert(char *chushu);

void main(int argc,char *argv[])
{
char *a,b[RANGE];
a=b;
if(argc==3)
{
divide(argv[1],argv[2],a); /* 这里argv[1],argv[2]在内存中是连续存储的! */
printf("%s\n",a);
}
else
{
printf("%s\n","Input like this: divide.exe number1 number2 > result.txt");
exit(1);
}
}
void divide(char *beichushu,char *chushu,char *r)
{
int j,k=0,len_x,len_t;
char tem1[RANGE],tem2[RANGE],tem3[2],tem4[RANGE],tem4_t[RANGE],*n;
char dividend[RANGE],divisor[RANGE];

strcpy(dividend,beichushu);
strcpy(divisor,chushu);

/*shift 标准形式转换子程序*/
/* (didvidend:"xxxx.0" or "xxxx.xxxx")*/
/* (divisor:"xxxx" )*/
shift(dividend,convert(divisor));
len_x=0;
len_t=0;
k=0;
strcpy(tem4,"");

do
{
if(divisor[0]=='0')
{
printf("Cannot divide by 0!");
break;
}
if(k==PRECISION||k==RANGE)
{
break;
}
if(dividend[len_t]=='.')
{
if(k==0)
r[k++]='0';

r[k++]='.';
r[k]='\0';
len_t++;
}

tem1[len_x++]=dividend[len_t++];
tem1[len_x]='\0';

if(dividend[len_t]=='\0')
{
dividend[len_t]='0';
dividend[len_t+1]='\0';
}

for(j=1;j<=10;j++)
{
tem3[0]=j+'0';
tem3[1]='\0';
multiply(divisor,tem3,tem2);

subtract(tem1,tem2,tem4);
if(tem4[0]=='-')
{
if(tem1[0]=='0')
{
tem1[0]='\0';
len_x=0;
}
if(!(j==1&&k==0))
r[k++]='0'+j-1;
if(j!=1)
{
strcpy(tem1,tem4_t);
len_x=strlen(tem1);
}
break;
}
else if(tem4[0]=='0')
{
r[k++]='0'+j;
tem4_t[0]='\0';
tem4[0]='\0';
len_x=0;
break;
}
else
strcpy(tem4_t,tem4);
}
}while(1);

r[k]='\0';
}

void multiply(const char *dividend,const char *divisor,char *r)
{
int i,j,k,f=0,sum=0,len1=0,len2=0,*m,*n;

len1=strlen(dividend);
len2=strlen(divisor);
m=(int *)malloc(sizeof(int)*len2*(len1+len2));
n=(int *)malloc(sizeof(int)*(len1+len2));

for(i=0;i<len2*(len1+len2);i++)
{
m[i]=0;
n[i]=0;
}
for(j=len2-1;j>=0;j--)
for(i=len1-1;i>=0;i--)
m[(len2-1-j)*(len1+len2)+(i+j+1)]=(divisor[j]-'0')*(dividend[i]-'0');

for(i=len1+len2-1;i>=0;i--)
{
sum=0;
for(j=0;j<len2;j++)
sum+=m[(len1+len2)*j+i];
sum+=f;
n[i]=sum%10;
f=sum/10;
}
j=0;
for(i=0;i<len1+len2;i++)
{
if(n[i]==0&&j==0)
continue;
r[j++]=n[i]+'0';
}

if(j==0) r[j++]='0';

r[j]='\0';
free(m);
free(n);
}

void subtract(const char *dividend,const char *divisor,char *r) /* 减法子程序 */
{
int i,j,len1,len2,sign=0,a[RANGE];
char *b,*cdividend,*cdivisor;

if(dividend[0]=='\0')
{
r[0]='-';
strcat(r,divisor);
return;
}
cdividend=(char *)malloc(sizeof(char)*strlen(dividend));
cdivisor=(char *)malloc(sizeof(char)*strlen(divisor));

strcpy(cdividend,dividend);
strcpy(cdivisor,divisor);

len1=strlen(cdividend);
len2=strlen(cdivisor);

if((len2>len1)||((len1==len2)&&(strcmp(cdividend,cdivisor)<0)))
{
sign=1;
b=cdividend; cdividend=cdivisor; cdivisor=b;
i=len1; len1=len2; len2=i;
}

for(i=len1-1;i>=0;i--)
{
if(len2-(len1-i)<0)
{
a[i]=cdividend[i]-'0';
continue;
}
j=i;
while(cdividend[i]-cdivisor[len2-(len1-i)]<0)
{
j--;
if(cdividend[j]>'0'&&j>=0)
{
cdividend[j]--;
cdividend[j+1]+=10;
j+=2;
}
}

a[i]=cdividend[i]-cdivisor[len2-(len1-i)];

}

j=0;
if(sign==1)
r[j++]='-';
for(i=0;i<len1;i++)
{
if((a[i]==0&&j==0)||(r[0]=='-'&&a[i]==0&&j==1))
continue;
r[j++]=a[i]+'0';
}
if(j==0)
r[j++]='0';
r[j]='\0';
free(cdividend);
free(cdivisor);
}
void shift(char *str,int weishu)
{
int i=0,j=0;

for(i=0;str[i]!='.'&&str[i]!='\0';i++);

if(str[i]=='.'&&str[i+1]=='\0')
{
str[i+1]='0';
str[i+2]='\0';
}
else if(str[i]=='\0')
{
str[i]='.';
str[i+1]='0';
str[i+2]='\0';
}
for(j=0;j<weishu;j++)
{
if(str[i+j+1]=='\0')
{
str[i+j+1]='0';
str[i+j+2]='\0';
}
str[i+j]=str[i+j+1];
str[i+j+1]='.';
}
if(str[i+j+1]=='\0') /* form : "xxxxx.0" or "xxxx.xxx"*/
{
str[i+j+1]='0';
str[i+j+2]='\0';
}
}
int convert(char *chushu)
{
int i=0,j=0,weishu=0;
for(i=0;chushu[i]!='.'&&chushu[i]!='\0';i++);

if(chushu[i]=='\0')
{
if(i==0)
{
chushu[0]='0';
chushu[1]='\0';
}
return 0;
}

weishu=0;
while(1)
{
if(chushu[i]=='.'&&chushu[i+1]=='\0')
{
chushu[i]='\0';
break;
}
chushu[i]=chushu[i+1];
chushu[i+1]='.';
i++;
weishu++;
}
while(chushu[0]=='0')
{
for(j=0;chushu[j]!='\0';j++)
{
chushu[j]=chushu[j+1];
}
if(chushu[0]=='\0')
{
chushu[0]='0';
chushu[1]='\0';
return 0;
}
}
return weishu;
}






jixingzhong 2006-12-16
  • 打赏
  • 举报
回复
上面的调用是 调用了 sdivkr, 结果是一个商和一个余数;

可以这样: ??.exe 123123123 /10 8762548 回车
得到的结果就是一个 带10位小数的的一个 商了
jixingzhong 2006-12-16
  • 打赏
  • 举报
回复
程序编译后得到 ??.exe,
在控制台下执行命令:
??.exe 123123123 / 8762548 回车
jixingzhong 2006-12-16
  • 打赏
  • 举报
回复
/*程序使用范例:
cal n1 op n2
cal 123123123 + 8762548
cal 123123123 - 8762548
cal 123123123 * 8762548
cal 123123123 / 8762548
cal 123123123 /200 8762548 ##精确到200位
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int cchkdig(char *r)
{
int i=0;
while(r[i]!='\0')
{
if(isdigit(r[i++])==0)
return (0);
}
return (1);
}

//去掉整数串表示前面多余的零,最后结果为空串时置为"0"
void cdel0(char *r)
{
unsigned int lr;
int i=0, j;
lr=strlen(r);
while(r[i]=='0')
++i;
if(i>0)
{
for(j=0; j<lr-i; ++j)
r[j]=r[j+i];
for(j=lr-i; j<lr; ++j)
{
r[j]='\0';
}

}

if(r[0]=='\0')
{
r[0]='0';
}
}

int scmp(char *r, char *u)
{
unsigned int lr, lu;
cdel0(r);
cdel0(u);

lr=strlen(r);
lu=strlen(u);

if(lr>lu)
{
return 1;
}
else if (lr<lu)
{
return -1;
}
return (strcmp(r, u));

}//end scmp()

//两个串表示数的减法
char *ssub(char *r, char *u)
{
unsigned int i,lr, lu, lp,c=0;
char h,hc;
char *p;
if(scmp(r, u)<0)
return NULL;
lr=strlen(r);
lu=strlen(u);
p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));
for(i=0; i<lu; ++i)
{
h=r[lr-i-1]-u[lu-i-1]-c;
if(h<0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]=h+'0';
hc=h+'0';
}
for (i=lu; i<lr; ++i)
{
h=r[lr-i-1]-'0'-c;
if(h<0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]='0'+h;
hc='0'+h;
}
p[i]='\0';
lp=i-1;

while(p[lp]=='0'&&lp!=0)
{
p[lp]='\0';
lp--;
}


for(i=0; i<(lp+1)/2; ++i)
{
hc=p[i];
p[i]=p[lp-i];
p[lp-i]=hc;
}
return (p);
}//end ssub()

//两个串表示数的加法
char *sadd(char *r, char *u)
{
unsigned int lr, lu, lp;
int i, h, c=0;
char hc, *p;
lr=strlen(r);
lu=strlen(u);
if(lu>lr)
{
p=r;
r=u;
u=p;
h=lr;
lr=lu;
lu=h;
}
p=(char *)malloc((unsigned int)(lr+2)*sizeof(char));
for(i=0; i<lu; ++i)
{
h=r[lr-i-1]-'0'+u[lu-i-1]-'0'+c;
if(h>9)
{
c=1;
h=h-10;
}
else
c=0;
p[i]=h+'0';
}
for(i=lu; i<lr; ++i)
{
h=r[lr-i-1]-'0'+c;
if(h>9)
{
c=1;
h=h-10;
}
else
c=0;
p[i]='0'+h;
}
if(c>0)
{
p[i]=c+'0';
lp=i;
}
else
lp=i-1;
for(i=lp+1; i<lr+2; ++i)
p[i]='\0';
for(i=0; i<(lp+1)/2; ++i)
{
hc=p[i];
p[i]=p[lp-i];
p[lp-i]=hc;
}
return (p);
}//end sadd()

//两个串表示数的乘法
char *smut(char *r, char *u)
{
unsigned int lr, lu, lp;
int i, j, c, h;
char *p;
lr=strlen(r);
lu=strlen(u);
p=(char *)malloc((unsigned int)(lr+lu+1)*sizeof(char));
for(i=0; i<lr+lu; ++i)
p[i]='0';
p[lr+lu]='\0';

for(i=lr-1; i>=0; --i)
{
c=0;
for(j=lu-1; j>=0; --j)
{
lp=i+j+1;
h=(r[i]-'0')*(u[j]-'0')+p[lp]-'0'+c;
c=h/10;
h=h%10;
p[lp]=h+'0';
}
if(c>0)p[i+j+1]=c+'0';
}

cdel0(p);
return p;
}//end smut()

//两个串表示数的除法,结果精确到小数点后第n位
char *sdivf(char *u, char *v, int n)
{
char *p, *f, *r,*q;
unsigned int i, lu, lv, lr, iw, c, h;
int kh, j;
lu=strlen(u);
lv=strlen(v);
f=(char *)malloc((unsigned int)(lu+n+3)*sizeof(char));
q=(char *)malloc(sizeof(char));
for(i=0; i<lu+n+3; ++i)
f[i]='\0';
r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
for(i=0; i<lv+2; ++i)
r[i]='\0';
for(iw=0; iw<lu+n+2; ++iw)
{
if(iw<lu)
{
cdel0(r);
lr=strlen(r);
r[lr]=u[iw];
r[lr+1]='\0';
}

else if(iw>lu)
{
cdel0(r);
q[0]='0';
if(scmp(r, q)==0)
{
break;
}
lr=strlen(r);
r[lr]='0';
r[lr+1]='\0';
}

else
{
f[lu]='.';
continue;
}

kh=0;
while(scmp(r, v)>=0)
{
p=r;
r=ssub(p, v);
++kh;
}
f[iw]=kh+'0';
}
if(iw==lu+n+2)
{
if(f[lu+n+1]>='5')
{
f[lu+n+1]='\0';
c=1;
for(j=lu+n; j>=0; --j)
{
if(c==0)
{
break;
}
if(f[j]=='.')
{
continue;
}
h=f[j]-'0'+c;
if(h>9)
{
h=h-10;
c=1;
}
else
c='\0';
f[j]=h+'0';
}
}
else
f[lu+n+1]='\0';

}
free(r);
free(p);
q=NULL;
free(q);
cdel0(f);
return(f);
}//end sdivf()

//两个串表示数的除法,结果分别用整商与余数表示
char *sdivkr(char *u, char *v, char **rout)
{
char *f, *r;
unsigned int i, lu, lv, lr, iw;
int kh;
lu=strlen(u);
lv=strlen(v);

f=(char *)malloc((unsigned int)(lu+1)*sizeof(char));
for(i=0; i<lu+1; ++i) f[i]='\0';
r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
for(i=0; i<lv+2; ++i) r[i]='\0';

for(iw=0; iw<lu; ++iw)
{
cdel0(r);
lr=strlen(r);
r[lr]=u[iw];
r[lr+1]='\0';
kh=0;
while(scmp(r, v)>=0)
{
r=ssub(r, v);
++kh;
}
f[iw]=kh+'0';
}
cdel0(r);
*rout=r;
cdel0(f);
return(f);

}//end *sdivkr()

//调用上述函数实现两任意长正整数任意指定精度的算术计算器程序
void main(int argc, char *argv[])
{
char *p, *r;
int n;
if(argc!=4)
{
if(argc!=3)
printf("\n>>\"order n1 op n2\" or n ! ");
exit(0);
}
cdel0(argv[1]);
if(cchkdig(argv[1])==0)
{
printf("Input data error, Input again!");
exit(0);
}
cdel0(argv[3]);
if(cchkdig(argv[3])==0)
{
printf("Input data error, Input again!");
exit(0);
}

if(strcmp(argv[2], "+")==0)
{
printf("%s", p=sadd(argv[1], argv[3]));
free(p);
}

else if(strcmp(argv[2], "-")==0)
{
printf("%s", p=ssub(argv[1], argv[3]));
free(p);
}

else if(strcmp(argv[2], "*")==0)
{
printf("%s", p=smut(argv[1], argv[3]));
free(p);
}

else if(argv[2][0]=='/' && strlen(argv[2])==1)
{
if(argv[3][0]=='0')
{
printf("error!devided by zero!!\n");
exit(0);
}
p=sdivkr(argv[1], argv[3], &r);
printf("k=%s r=%s", p, r);
free(p);
free(r);
}

else if(argv[2][0]=='/'&&strlen(argv[2])>1)
{
if(argv[3][0]=='0')
{
printf("error!devided by zero!!\n");
exit(0);
}

argv[2][0]='\0';
cdel0(argv[2]);
if(cchkdig(argv[2])==0)
{
printf("Input data error, Input again!");
exit (0);
}
n=atoi(argv[2]);
printf("%s", p=sdivf(argv[1], argv[3], n));
free(p);
}


}
宙斯之神 2006-12-16
  • 打赏
  • 举报
回复
按照我写的main()是运行结果不正确,原代码的main我没弄懂怎么测试数据是否正确
开始的时候我得到了很多组的正确结果
YeTimmy 2006-12-16
  • 打赏
  • 举报
回复
调逻辑错误还是编译错误??
宙斯之神 2006-12-16
  • 打赏
  • 举报
回复
咳 真的没人能帮上忙吗?-_-
argenCHN 2006-12-16
  • 打赏
  • 举报
回复
up
宙斯之神 2006-12-16
  • 打赏
  • 举报
回复
奇怪啦, 我就把你上面的原封不动的粘贴上,就是结果不对
longjing_g 2006-12-16
  • 打赏
  • 举报
回复
我运行你的程序,结果是正确的啊!!!!!!!

你一定是改了其他的!!!

/*程序使用范例:
cal n1 op n2
cal 123123123 + 8762548
cal 123123123 - 8762548
cal 123123123 * 8762548
cal 123123123 / 8762548
cal 123123123 /200 8762548 ##精确到200位
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int cchkdig(char *r)
{
int i=0;
while(r[i]!='\0')
{
if(isdigit(r[i++])==0)
return (0);
}
return (1);
}

//去掉整数串表示前面多余的零,最后结果为空串时置为"0"
void cdel0(char *r)
{
unsigned int lr;
int i=0, j;
lr=strlen(r);
while(r[i]=='0')
++i;
if(i>0)
{
for(j=0; j<lr-i; ++j)
r[j]=r[j+i];
for(j=lr-i; j<lr; ++j)
{
r[j]='\0';
}

}

if(r[0]=='\0')
{
r[0]='0';
}
}

int scmp(char *r, char *u)
{
unsigned int lr, lu;
cdel0(r);
cdel0(u);

lr=strlen(r);
lu=strlen(u);

if(lr>lu)
{
return 1;
}
else if (lr<lu)
{
return -1;
}
return (strcmp(r, u));

}//end scmp()

//两个串表示数的减法
char *ssub(char *r, char *u)
{
unsigned int i,lr, lu, lp,c=0;
char h,hc;
char *p;
if(scmp(r, u)<0)
return NULL;
lr=strlen(r);
lu=strlen(u);
p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));
for(i=0; i<lu; ++i)
{
h=r[lr-i-1]-u[lu-i-1]-c;
if(h<0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]=h+'0';
hc=h+'0';
}
for (i=lu; i<lr; ++i)
{
h=r[lr-i-1]-'0'-c;
if(h<0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]='0'+h;
hc='0'+h;
}
p[i]='\0';
lp=i-1;

while(p[lp]=='0'&&lp!=0)
{
p[lp]='\0';
lp--;
}


for(i=0; i<(lp+1)/2; ++i)
{
hc=p[i];
p[i]=p[lp-i];
p[lp-i]=hc;
}
return (p);
}//end ssub()

//两个串表示数的加法
char *sadd(char *r, char *u)
{
unsigned int lr, lu, lp;
int i, h, c=0;
char hc, *p;
lr=strlen(r);
lu=strlen(u);
if(lu>lr)
{
p=r;
r=u;
u=p;
h=lr;
lr=lu;
lu=h;
}
p=(char *)malloc((unsigned int)(lr+2)*sizeof(char));
for(i=0; i<lu; ++i)
{
h=r[lr-i-1]-'0'+u[lu-i-1]-'0'+c;
if(h>9)
{
c=1;
h=h-10;
}
else
c=0;
p[i]=h+'0';
}
for(i=lu; i<lr; ++i)
{
h=r[lr-i-1]-'0'+c;
if(h>9)
{
c=1;
h=h-10;
}
else
c=0;
p[i]='0'+h;
}
if(c>0)
{
p[i]=c+'0';
lp=i;
}
else
lp=i-1;
for(i=lp+1; i<lr+2; ++i)
p[i]='\0';
for(i=0; i<(lp+1)/2; ++i)
{
hc=p[i];
p[i]=p[lp-i];
p[lp-i]=hc;
}
return (p);
}//end sadd()

//两个串表示数的乘法
char *smut(char *r, char *u)
{
unsigned int lr, lu, lp;
int i, j, c, h;
char *p;
lr=strlen(r);
lu=strlen(u);
p=(char *)malloc((unsigned int)(lr+lu+1)*sizeof(char));
for(i=0; i<lr+lu; ++i)
p[i]='0';
p[lr+lu]='\0';

for(i=lr-1; i>=0; --i)
{
c=0;
for(j=lu-1; j>=0; --j)
{
lp=i+j+1;
h=(r[i]-'0')*(u[j]-'0')+p[lp]-'0'+c;
c=h/10;
h=h%10;
p[lp]=h+'0';
}
if(c>0)p[i+j+1]=c+'0';
}

cdel0(p);
return p;
}//end smut()

//两个串表示数的除法,结果精确到小数点后第n位
char *sdivf(char *u, char *v, int n)
{
char *p, *f, *r,*q;
unsigned int i, lu, lv, lr, iw, c, h;
int kh, j;
lu=strlen(u);
lv=strlen(v);
f=(char *)malloc((unsigned int)(lu+n+3)*sizeof(char));
q=(char *)malloc(sizeof(char));
for(i=0; i<lu+n+3; ++i)
f[i]='\0';
r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
for(i=0; i<lv+2; ++i)
r[i]='\0';
for(iw=0; iw<lu+n+2; ++iw)
{
if(iw<lu)
{
cdel0(r);
lr=strlen(r);
r[lr]=u[iw];
r[lr+1]='\0';
}

else if(iw>lu)
{
cdel0(r);
q[0]='0';
if(scmp(r, q)==0)
{
break;
}
lr=strlen(r);
r[lr]='0';
r[lr+1]='\0';
}

else
{
f[lu]='.';
continue;
}

kh=0;
while(scmp(r, v)>=0)
{
p=r;
r=ssub(p, v);
++kh;
}
f[iw]=kh+'0';
}
if(iw==lu+n+2)
{
if(f[lu+n+1]>='5')
{
f[lu+n+1]='\0';
c=1;
for(j=lu+n; j>=0; --j)
{
if(c==0)
{
break;
}
if(f[j]=='.')
{
continue;
}
h=f[j]-'0'+c;
if(h>9)
{
h=h-10;
c=1;
}
else
c='\0';
f[j]=h+'0';
}
}
else
f[lu+n+1]='\0';

}
free(r);
free(p);
q=NULL;
free(q);
cdel0(f);
return(f);
}//end sdivf()

//两个串表示数的除法,结果分别用整商与余数表示
char *sdivkr(char *u, char *v, char **rout)
{
char *f, *r;
unsigned int i, lu, lv, lr, iw;
int kh;
lu=strlen(u);
lv=strlen(v);

f=(char *)malloc((unsigned int)(lu+1)*sizeof(char));
for(i=0; i<lu+1; ++i) f[i]='\0';
r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
for(i=0; i<lv+2; ++i) r[i]='\0';

for(iw=0; iw<lu; ++iw)
{
cdel0(r);
lr=strlen(r);
r[lr]=u[iw];
r[lr+1]='\0';
kh=0;
while(scmp(r, v)>=0)
{
r=ssub(r, v);
++kh;
}
f[iw]=kh+'0';
}
cdel0(r);
*rout=r;
cdel0(f);
return(f);

}//end *sdivkr()

/*
//调用上述函数实现两任意长正整数任意指定精度的算术计算器程序
int main(int argc, char *argv[])
{
char *p, *r;
int n;
if(argc!=4)
{
if(argc!=3)
printf("\n>>\"order n1 op n2\" or n ! ");
exit(0);
}
cdel0(argv[1]);
if(cchkdig(argv[1])==0)
{
printf("Input data error, Input again!");
exit(0);
}
cdel0(argv[3]);
if(cchkdig(argv[3])==0)
{
printf("Input data error, Input again!");
exit(0);
}

if(strcmp(argv[2], "+")==0)
{
printf("%s", p=sadd(argv[1], argv[3]));
free(p);
}

else if(strcmp(argv[2], "-")==0)
{
printf("%s", p=ssub(argv[1], argv[3]));
free(p);
}

else if(strcmp(argv[2], "*")==0)
{
printf("%s", p=smut(argv[1], argv[3]));
free(p);
}

else if(argv[2][0]=='/' && strlen(argv[2])==1)
{
if(argv[3][0]=='0')
{
printf("error!devided by zero!!\n");
exit(0);
}
p=sdivkr(argv[1], argv[3], &r);
printf("k=%s r=%s", p, r);
free(p);
free(r);
}

else if(argv[2][0]=='/'&&strlen(argv[2])>1)
{
if(argv[3][0]=='0')
{
printf("error!devided by zero!!\n");
exit(0);
}

argv[2][0]='\0';
cdel0(argv[2]);
if(cchkdig(argv[2])==0)
{
printf("Input data error, Input again!");
exit (0);
}
n=atoi(argv[2]);
printf("%s", p=sdivf(argv[1], argv[3], n));
free(p);
}
}
*/

int main()
{

char scan1[20], scan2[20];
char *p;
printf("first = ");
gets(scan1);
printf("second=");
gets(scan2);
cdel0(scan1);
cdel0(scan2);
printf("%s", p=sdivf(scan1, scan2, 30));
getch();
}
加载更多回复(10)

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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