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 * 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码的表 你看下就应该明白了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)