大数相乘c语言
A. c语言大整数乘法
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;
}
B. c语言中用分治法求大数相乘的代码
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define N 100//最大100位
/* 函数声明 */
void calc1(char* str1,int len1,int* tmp,int m);
void accumulate(int cnt,int* res,int res_len,int* tmp,int tmp_len);
char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len);
int main()
{
int i,j;
/* 获取计算数据(可以从文件中读取) */
char str1[N]={NULL};
char str2[N]={NULL};
char result[N*N]={NULL};
printf("Input Num1: \n");
scanf("%s",str1);
fflush(stdin);
printf("Input Num2: \n");
scanf("%s",str2);
/* 计算两个字符串的长度,及存储结果所需要的空间 */
int len1=strlen(str1),len2=strlen(str2);
int len=len1+len2;
/* 计算并输出计算结果 */
printf("The result is: %s\n",bignum_multi(str1,len1,str2,len2,result,len));
return 0;
}
/*===============================================================
调用calc1和accumulate函数计算大数相乘
===============================================================*/
char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len)
{
int i,j,m=0,cnt=0,*tmp,*res;
/* 分配临时结果的存放空间 */
tmp=(int*)malloc((len1+1)*sizeof(int));
res=(int*)malloc(len*sizeof(int));
/* 初始化两个数组 */
for(i=0;i<len1;i++)
tmp[i]=0;
for(j=0;j<len;j++)
res[j]=0;
for(i=len2-1;i>=0;i--)
{
/* 获取乘数中第i位的值 */
m=str2[i]-'0';
/* 计算被乘数与第i位的乘积,结果保存在tmp整型数组中 */
calc1(str1,len1,tmp,m);
/* 将tmp数组中的值加到res数组中 */
cnt++;
accumulate(cnt,res,len,tmp,len1+1);
}
/* 将整形数组res中的值转化成字符串存入result中 */
i=0;j=0;
/* 去掉res中第一个非零数字前的零 */
while(res[i++]==0);
for(m=i-1;m<len;m++,j++)
result[j]=res[m]+0x30;
result[j]='\0';
free(tmp);
free(res);
return result;
}
/*===============================================================
计算被乘数与乘数的某一位的乘积
===============================================================*/
void calc1(char* str1,int len1,int* tmp,int m)
{
/* d两个位的乘积结果,remainder余数,carry进位 */
int i,d=0,remainder=0,carry=0;
/* 从被乘数字符串'\0'的前一位算起 */
for(i=len1-1;i>=0;i--)
{
d=str1[i]-'0';
d*=m;
remainder=(d+carry)%10;
carry=(d+carry)/10;
tmp[i+1]=remainder;
}
if(carry)
tmp[0]=carry;
else
tmp[0]=0;
}
/*===============================================================
将被乘数与乘数中一位数字的乘积结果计入res数组中
===============================================================*/
void accumulate(int cnt,int* res,int len,int* tmp,int len1)
{
int m=0,n=0,i,k,remainder=0;
static int carry=0;
for(k=len1-1,i=0;k>=0;k--,i++)
{
m=tmp[k];
n=res[len-cnt-i];
if(m+n+carry>=10)
{
remainder=(m+n+carry)%10;
carry=1;
}
else
{
remainder=m+n+carry;
carry=0;
}
res[len-cnt-i]=remainder;
}
}
C. c语言 大整数乘法
#include <stdio.h>
#include<string.h>
int main()
{
int i,j,k=0;
char a[201]="0",b[201]="0",c[401]="0"; //这里将c[0]设为‘0’,影响到下面输入
scanf("%s%s",a,b);
for (i=0;i<=strlen(a)-1;i++)
for (j=0;j<=strlen(b)-1;j++)
{c[i+j+1]+=(a[i]-'0')*(b[j]-'0');}
k=(strlen(a)+strlen(b)-1);
for (;k>=1;k--)
{
c[k-1]+=c[k]/10;
c[k]=c[k]%10; //这一步会将c[k]破坏,所以倒转
}
if(c[0]!='0') //若最高位为0,则不输出;
printf("%c",c[0]);
j=strlen(a)+strlen(b);
for (i=1;i<j;i++)
{
printf("%d",c[i]);
}
return 0;
}
======================================
系统报错的原因是c[1]是char型,不是字符串数组,要用%c而是%s,我想你是把i写成了1了
D. 求一C语言编程:求两个大数的乘积。
看到这个问题后编啦两天才出来
兄台真的累啊
我是个新手 有些累赘的地方或不扒乱歼足的地方多多包涵
/* 大数相乘 */
#include "stdio.h"
void main()
{
char a[100],b[100];
int i,j,k,l,m,t,n,h,f,a1[100],b1[100],c[100][100]={0},d[100];
printf("Input the first Number:"); //以字符形式输春冲入第一个大数
for(i=0;;i++)
{
a[i]=getchar();
if(a[i]=='\n') break;
}
printf("Input the second Number:"); //以字符形式输入第二个大数
for(j=0;;j++)
{
b[j]=getchar();
if(b[j]=='\n') break;
}
for(k=0;k<i;k++) //字符转换成数组
{
a1[k]=a[k]-48;
}
for(k=0;k<j;k++)
{
b1[k]=b[k]-48;
}
for(k=i-1;k>=0;k--) //数组1的每位数分别乘数组2
{
h=0;
for(l=j-1,m=0;l>=0;m++) //******
{
f=100-(i-1-k)-m;
t=c[k][f]=h+a1[k]*b1[l--];
c[k][f]=t%10;
h=t/10;
}
if(t>=10) c[k][f]=h;
}
for(h=100;h>0;h--) d[h]=c[0][h];
陪此for(k=1;k<i;k++)
{
for(m=100;m>0;m--)
{
t=d[m]+c[k][m]+h;
d[m]=t%10;
h=t/10;
}
}
printf("The answer is :\n ");
for(i=0;i<=100;i++)
{
if(d[i]!=0)
{
for(;i<=100;i++) printf("%d",d[i]);
break;
}
}
}
E. c语言大整数乘法
#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
*/
F. 关于C语言两个大数相乘
//#include
<stdafx.h>
//此头文件不可丢
#include
<stdio.h>
#include
<string.h>
#define
N
200
//预编译将后面数组的的长度定义为200;
int
main()
{
void
GetDigits(int
a[],
char
s[]);
void
multiply(int
a[],
int
b[],
int
c[]);
char
s1[N],
s2[N];
//起初定义两个字符串数组s1和s2,用来存储两个判塌简相乘的大数掘裤;
int
i,
j,
a[N],
b[N],
c[N
*
2];
printf("\n
input
number
a:
");//输入两个数字的字符串;
scanf("%s",
s1);
printf("\衫明n
input
number
b:
");
scanf("%s",
s2);
//把输入的字符串,按位存放到数组
GetDigits(a,
s1);
GetDigits(b,
s2);
multiply(a,
b,
c);
//找到最高位
j
=
N
*
2
-
1;
while(c[j]
==
0)
j--;
//打印计算结果
printf("\n
%s
*
%s=",
s1,
s2);
for(i
=
j;
i
>=
0;
i--)
printf("%d",
c[i]);
return
0;
}
//下面Getsights函数的目的是把字符串形式的数字按位存放到数组
void
GetDigits(int
*a,
char
*s)
{
int
i;
char
digit;
int
len
=
strlen(s);
for(i
=
0;
i
<
N;
i++)
a[i]
=
0;
for(i
=
0;
i
<
len;
i++)
{
digit
=
s[i];
a[len
-
1
-
i]
=
digit
-
'0';
}
}
//把a*b的结果存储到数组c中,按位表示;
void
multiply(int
*a,
int
*b,
int
*c)
{
int
i,
j;
for(i
=
0;
i
<
N
*
2;
i++)
c[i]
=
0;
//先把结果数组设置为0;
for(i
=
0;
i
<
N;
i++)
for(j
=
0;
j
<
N;
j++)
c[i
+
j]
+=
a[i]
*
b[j];
//
处理进位
for(i
=
0;
i
<
N
*
2
-
1;
i++)
{
c[i
+
1]
+=
c[i]
/
10;
//进位累加到高位
c[i]
=
c[i]
%
10;
//该位的最后结果
}
}
G. C语言大整数相乘
我用C语言写了一个,在VC2005下测试通过。
#include <stdio.h>
#include <string.h>
typedef unsigned char CHAR;
typedef unsigned int UINT;
/*十进制形式的a与b,注意低位在前高位在后*/
CHAR a[10000];/*被乘数*/
CHAR c[20000];/*乘积和乘数*/
UINT temp1,temp2;/*用来存放中间结果*/
UINT da, db; /*记录a和b的位数*/
/*清零*/
void Zero( CHAR* x, UINT n )
{
UINT i;
for ( i = 0; i < n; i ++ )
x[i] = '0';
}
CHAR CharToNum( CHAR c )
{
return c - 0x30;
}
CHAR NumToChar( CHAR c )
{
return c + 0x30;
}
/*这个函数模拟大整数的左移*/
void LShift( CHAR* x, int digits )
{
UINT i;
for ( i = 0; i < digits - 1; i ++ ) {
x[i] = x[i+1];
}
x[digits] = 0;
}
/*这个乘法函数计算大整数a与给定的y的乘积,乘积加入c右半部*/
void OneDigitMultiply( UINT y )
{
UINT i;
UINT cm = 0; /*乘法进位*/
UINT ca = 0; /*加法进位*/
if ( y != 0 ) {
for ( i = 0; i < da; i ++ ) {
/*乘*/
temp1 = ((UINT)a[i]) * y + cm;
cm = temp1 / 10;
temp1 %= 10;
/*加*/
temp2 = ((UINT)c[i+10000]) + temp1 + ca;
if ( temp2 > 9 ) {
ca = 1;
temp2 -= 10;
} else {
ca = 0;
}
c[i+10000] = temp2;
}
c[da+10000] += cm + ca;
}
else {
/*如果被乘数本位是0就直接返回*/
return;
}
}
/*这个函数用来输出*/
void OutputResult()
{
CHAR* p = c + 20000;
while( *p == 0 ) {
p --;
}
printf("乘积是:\n");
while( *p != 'x' ) {
printf("%d", *p);
p --;
}
}
void main()
{
Zero( a, 10000 );
Zero( c, 10000 );
printf("输入被乘数:");
scanf("%s",a);
printf("输入乘数:");
scanf("%s",c);
/*记录位数*/
da = strlen( (const char*)a );
db = strlen( (const char*)c );
/*反转以使低位在前*/
strrev( (char*)a );
strrev( (char*)c );
UINT i;
/*a与b存储的是char字符,减去0x30就能直接当数字使用了*/
for ( i = 0; i < 10000; i ++ ) {
if ( a[i] != '\0' ) {
a[i] = CharToNum( a[i] );
}
}
for ( i = 0; i < 20000; i ++ ) {
if ( c[i] != '\0' ) {
c[i] = CharToNum( c[i] );
}
}
/*这个乘法算法可以参看二进制乘法器的原理*/
for ( i = 0; i < db; i ++ ) {
OneDigitMultiply( c[0] );
LShift(c, 20000);
}
c[10000-db-1] = 'x'; /*给数字尾部作个标记*/
OutputResult();
getchar();
getchar();
}
第二题:
#include <stdio.h>
void main()
{
float a;
scanf("%f",&a);
if ( a - (int)a == 0 ) {
printf("是整数\n");
}
else {
printf("不是整数\n");
}
getchar();
getchar();
}
H. C语言 大数乘法
是a[j++]=str1[i]-'0'; 这个没看懂吗?
因为字符输入存的是ASCII码。所以字符串’0‘其实在内存里晌厅不是存的0而且一个别的数字。
这里利用到ASCII排序的规律,只要减去做谨桥’0‘这个码的值就能得到相应的字符数字的对应整形值了。
http://ke..com/view/15482.htm 这个是ASCII码的表 你纯猛看下就应该明白了
I. 用分治法怎么写大整数乘法的算法(用c语言写)
//大数的乘法,以前写的
#include<iostream>
#include<string>
usingnamespacestd;
voidtoInt(char*s,int*in)
{
inti;
strrev(s);
for(i=0;i<strlen(s);i++)
{
in[i]=s[i]-'0';
}
}
voidrevint(int*in,intn)
{
inti,temp;
for(i=0;i<n/2;i++)
{
temp=in[i];
in[i]=in[n-i-1];
in[n-i-1]=temp;
}
}
intmain()
{
charc1[200],c2[200];
inta1[200]={0}; //大数1
inta2[200]={0}; //大数2
intr2[300]={0}; //保存大结果
intf=0; //保存进位
inti,j;
cin>>c1>>c2;
if(strcmp(c1,"0")!=0&&strcmp(c2,"0")!=0)
{
intlen1=strlen(c1);
intlen2=strlen(c2);
intmaxlen=len1+len2; //结果的最大位数
toInt(c1,a1);
toInt(c2,a2);
for(j=0;j<len2;j++)
{
intr1[200]={0}; //保存小结果
for(i=0;i<=len1;i++)
{
r1[i]=a2[j]*a1[i]+f;
if(r1[i]>9)
{
f=r1[i]/10;
r1[i]%=10;
}
else
{
f=0;
}
}
for(i=0;i<=len1;i++)
{
r2[j+i]+=r1[i];
if(r2[i+j]>9)
{
r2[i+j+1]+=r2[i+j]/10;
r2[i+j]%=10;
}
}
f=0;
}
revint(r2,maxlen);
if(r2[0]!=0)
cout<<r2[0];
for(i=1;i<maxlen;i++)
cout<<r2[i];
}
else
cout<<"0";
cout<<endl;
return0;
}
J. C语言,求两个大整数的乘积,解释详细一点。
/*
高精度乘法输入:两行,每行表示一个非负整数(不超过10000位)
输出:两数的乘积。
*/
#include <stdio.h>
#include <袜缺string.h>
#include <stdlib.h>
#define MAX 10001
int bigchenfa(int *sum,int *a,int *b,int la,int lb) /*高精度乘法*/
{
int i,j,lsum = 0 ;
memset(sum,0,sizeof(sum));
for(i=1 ; i<= la ; i++) /*用数组模拟运算*/
for(j=1,lsum=i-1; j<= lb ; j++)
sum[++lsum] += b[j] * a[i] ;
for(i=1 ; i<= lsum ; i++)/*进位处轮猜理*/
if (sum[i] >= 10)
{
if ( sum[lsum] >= 10)
lsum ++ ;
sum[i+1] += sum[i] / 10 ;
sum[i] %= 10 ;
}
return lsum ; /*返回积的位数*/
}
int main(void)
{
int a[MAX]={0},b[MAX]={0},sum[MAX*2]={0} ;
int la=0,lb=0,lsum=0;
int i,j ;
char sa[MAX],sb[MAX] ;
scanf("%s %s",sa,sb);
printf("%s * %s = ",sa,sb);
la = strlen(sa);
lb = strlen(sb);
for(i=1,j=la-1; i<= la ; i++,j--)
a[i] = sa[j] - '告桐辩0' ;
for(i=1,j=lb-1; i<= lb ; i++,j--)
b[i] = sb[j] - '0' ;
lsum = bigchenfa(sum,a,b,la,lb) ;
for(i=lsum ; i> 0 ; i--)
printf("%d",sum[i]);
printf(" ");
system("pause");
return 0 ;
}