c语言大整数乘法

c语言大整数乘法,第1张

dc这个函数里面连b这个参数都没有使用,这也能出结果...,

if(z[0]='0')continue 也写错了

不是打击你,你的代码太滥了,实在不想去找错误,给你我以前写的代码吧,你自己整理一下

#include <stdio.h>

int mulx(char * a,int b,char * r,int d)

void init(char * s)

char buf1[4*1024]

char buf2[4*1024]

char buf3[4*1024]

int main()

{

char * a

char * b

char * r

char * t

int d

int i

a = buf1

b = buf2

r = buf3

init(NULL)

while(scanf("%s %d",a,&d)!=EOF)

{

mulx(a,d,r,10)

printf("%s\n",r)

}

return 0

}

char c2d[256]//字符转换成数字

char * charset//代表数字的字符

/*功能:设置使用那些字符表示数字,默认的为"0123456789ABCDEF"*/

/*参数:*/

/*返回值:*/

void init(char * s)

{

int i

if(s==NULL)

charset = "0123456789ABCDEF"

else

charset = s

for(i=0i<256i++)

c2d[i] = 0

for(i=0charset[i]i++)

c2d[charset[i]] = i

}

/*功能:清除前导零*/

/*参数:需要清楚的数字*/

/*返回值:清零后数字的位数*/

int clearZeros(char * a)

{

int i,j

for(i=0a[i]==charset[0]i++)

for(j=0a[i]i++,j++)

a[j] = a[i]

a[j] = 0

if(j==0)

{

a[j++] = charset[0]

a[j] = 0

}

return j

}

/*功能:乘,用于进制转换之类*/

/*参数:a 和 b 分别为乘数,结果保存到 r , d 为使用的进制*/

/*注意:r 可以等于 a , b一定要小于d, 如果被乘数有前导0 则结果也会有前导0*/

/*返回值:结果的位数*/

int mulx(char * a,int b,char * r,int d)

{

int i,j,k,len

int c,t

if(r==NULL)

r = a

for(i=0a[i]i++)

len = k = i

for(c=0,i--,r[k--]=0i>=0 i--,k--)

{

t = c2d[a[i]] * b + c

c = t/d

r[k] = charset[t%d]

}

if(c)

{

for(i=len,j=++leni>=0i--,j--)

r[j] = r[i]

r[0]=charset[c]

}

return len

}

#include <iostream>

#include <fstream>

#include <string> //加入这行

using namespace std

void multiply(const char *a,const char *b)

int main()

{

string num1,num2     // 初始状态用string来存储大数

cout<<"现在,来两个大数吧! "<<endl

cin>>num1>>num2

const char *p1=num1.c_str()    // 将string转为 const char *

const char *p2=num2.c_str()    // 将string转为 const char *

multiply(p1,p2)

system("pause")

return 0

}

void multiply(const char *a,const char *b)

{

int i,j,ca,cb,*s

ca=strlen(a)

cb=strlen(b)

s=(int *)malloc(sizeof(int)*(ca+cb))   //分配存储空间

for (i=0i<ca+cbi++) s[i]=0      // 每个元素赋初值0

for (i=0i<cai++)

for (j=0j<cbj++)

s[i+j+1]+=(a[i]-'0')*(b[j]-'0')

           

for (i=ca+cb-1i>=0i--)        // 这里实现进位 *** 作,从低位到高位开始进位

if (s[i]>=10)               //将大于10的数的进位加到高位,即i-1位,i位留余数

{

s[i-1]+=s[i]/10

s[i]%=10

}

char *c=(char *)malloc((ca+cb)*sizeof(char))  //分配字符数组空间,因为它比int数组省!

i=0while(s[i]==0) i++   // 跳过头部0元素

for (j=0i<ca+cbi++,j++) c[j]=s[i]+'0'

c[j]='\0'

for (i=0i<ca+cbi++) cout<<c[i]

cout<<endl

free(s)

}

是a[j++]=str1[i]-'0'这个没看懂吗?

因为字符输入存的是ASCII码。所以字符串’0‘其实在内存里不是存的0而且一个别的数字。

这里利用到ASCII排序的规律,只要减去’0‘这个码的值就能得到相应的字符数字的对应整形值了。

http://baike.baidu.com/view/15482.htm 这个是ASCII码的表 你看下就应该明白了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12060844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存