第1个回答 2009-06-07
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=0;i<256;i++)
c2d[i] = 0;
for(i=0;charset[i];i++)
c2d[charset[i]] = i;
}
/*功能:清除前导零*/
/*参数:需要清楚的数字*/
/*返回值:清零后数字的位数*/
int clearZeros(char * a)
{
int i,j;
for(i=0;a[i]==charset[0];i++);
for(j=0;a[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=0;a[i];i++);
len = k = i;
for(c=0,i--,r[k--]=0;i>=0 ;i--,k--)
{
t = c2d[a[i]] * b + c ;
c = t/d;
r[k] = charset[t%d];
}
if(c)
{
for(i=len,j=++len;i>=0;i--,j--)
r[j] = r[i];
r[0]=charset[c];
}
return len;
}
第2个回答 2009-06-06
麻烦,管他那个是一位数,大整数
这里有个函数 chengfa,计算两个大数相乘,放在取代地一个数,如下:
#include<stdio.h>
#include<string.h>
void chengfa(char *a,char*b)
{
char c[10000];
int fuhao1,fuhao2;
if(a[0] == '-' || a[0] == '+') {
if(a[0] == '-')
fuhao1 = -1;
else fuhao1 = 1;
strcpy(c,a+1);
strcpy(a,c);
}
if(b[0] == '-' || b[0] == '+') {
if(b[0] == '-')
fuhao2 = -1;
else fuhao2 = 1;
strcpy(c,b+1);
strcpy(b,c);
}
int i , j;
for(i = 0; i< 10000;i++){
c[i] = '0';
}
int lena = strlen(a);
int lenb = strlen(b);
for(i = lena-1;i >=0;i--){
int k = 0;
for(j = lenb-1;j >=0;j--) {
char l = c[i+j+1];
c[i+j+1] = (c[i+j+1]-'0'+(b[j]-'0')*(a[i]-'0')+k)%10+'0';
k = (l-'0'+(b[j]-'0') * (a[i] -'0')+k)/10;
}
if(k!= 0) c[i] += k;
}
i = 0;
j = 0;
while(c[i] == '0') i++;
while(i <= lena+lenb-1) {
a[j] = c[i];
j ++;
i ++;
}
a[j] = '\0';
if(a[0] == '\0') a[0] = '0',a[1] = '\0';
if(fuhao1*fuhao2 == -1 && a[0] !='0') {
strcpy(c,a);
a[0] = '-';
a[1] = '\0';
strcat(a,c);
}
}
int main()
{
char a[10000],b[10000];
while(scanf("%s %s",a,b) == 2) {
chengfa(a,b);
printf("%s\n",a);
}
}
/*
//测试数据
3 4
12
1782362317836127863178 5
8911811589180639315890
2364782367834627864826 23478962483263478
55522636495472201715228381403526624828
*/
第3个回答 2020-07-03
#include<stdio.h>
#include<string.h>
void
chengfa(char
*a,char*b)
{
char
c[10000];
int
fuhao1,fuhao2;
if(a[0]
==
'-'
||
a[0]
==
'+')
{
if(a[0]
==
'-')
fuhao1
=
-1;
else
fuhao1
=
1;
strcpy(c,a+1);
strcpy(a,c);
}
if(b[0]
==
'-'
||
b[0]
==
'+')
{
if(b[0]
==
'-')
fuhao2
=
-1;
else
fuhao2
=
1;
strcpy(c,b+1);
strcpy(b,c);
}
int
i
,
j;
for(i
=
0;
i<
10000;i++){
c[i]
=
'0';
}
int
lena
=
strlen(a);
int
lenb
=
strlen(b);
for(i
=
lena-1;i
>=0;i--){
int
k
=
0;
for(j
=
lenb-1;j
>=0;j--)
{
char
l
=
c[i+j+1];
c[i+j+1]
=
(c[i+j+1]-'0'+(b[j]-'0')*(a[i]-'0')+k)%10+'0';
k
=
(l-'0'+(b[j]-'0')
*
(a[i]
-'0')+k)/10;
}
if(k!=
0)
c[i]
+=
k;
}
i
=
0;
j
=
0;
while(c[i]
==
'0')
i++;
while(i
<=
lena+lenb-1)
{
a[j]
=
c[i];
j
++;
i
++;
}
a[j]
=
'\0';
if(a[0]
==
'\0')
a[0]
=
'0',a[1]
=
'\0';
if(fuhao1*fuhao2
==
-1
&&
a[0]
!='0')
{
strcpy(c,a);
a[0]
=
'-';
a[1]
=
'\0';
strcat(a,c);
}
}
int
main()
{
char
a[10000],b[10000];
while(scanf("%s
%s",a,b)
==
2)
{
chengfa(a,b);
printf("%s\n",a);
}
}
/*
//测试数据
3
4
12
1782362317836127863178
5
8911811589180639315890
2364782367834627864826
23478962483263478
55522636495472201715228381403526624828
*/
第4个回答 2009-06-06
看不懂你的代码,这是我写的,可以用。
#include<stdio.h>
#define L 10
void dc(char *a,int b,char *c){
int i,j,k,t,carry=0;
int temp[L+1];
temp[0]=0;
for(i=0;a[i]!='\0';i++)
temp[i+1]=a[i]-'0';
j=i;
for(;i>=0;i--){
t=(temp[i]*b+carry)%10;
carry=(temp[i]*b+carry)/10;
temp[i]=t;
}
if(temp[0]==0) i=1;
else i=0;
k=0;
for(;i<=j;i++)
c[k++]='0'+temp[i];
c[k]='\0';
}
int main(){
char a[L],c[L+1];
int b;
printf("Enter the big integer: ");
scanf("%s",a);
printf("Enter the second integer: ");
scanf("%d",&b);
dc(a,b,c);
printf("The result is %s\n",c);
return 0;
}本回答被网友采纳
第5个回答 2009-06-06
LZ的程序有问题哦,怎么是大整数乘法,但是却定义的是字符型,而且
if(z[0]='0')continue; 中的=号应该改为==号,不过改了也有问题,还是看不懂LZ的思路,,