189 8069 5689

C语言大数相乘函数,c语言大数相乘的算法

c语言大数乘法

#includestdio.h

创新互联公司拥有网站维护技术和项目管理团队,建立的售前、实施和售后服务体系,为客户提供定制化的网站建设、网站制作、网站维护、四川乐山服务器托管解决方案。为客户网站安全和日常运维提供整体管家式外包优质服务。我们的网站维护服务覆盖集团企业、上市公司、外企网站、商城网站建设、政府网站等各类型客户群体,为全球成百上千家企业提供全方位网站维护、服务器维护解决方案。

void mul(int,int,int);      //没有返回值的话就用void,还有,你要在后面定义函数的话      

int count;                                        //先在前面声明

int main()

{

int a,b,c;

a=19;

b=22;

c=650;

mul(a,b,c);

printf("count=a*b*c=%d\n",count);

return 0;

}

void mul(int x,int y,int z)

{

count=x*y*z;

}

c语言中用分治法求大数相乘的代码

#includestdio.h

#includestring.h

#includemalloc.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;ilen1;i++)

tmp[i]=0;

for(j=0;jlen;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;mlen;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语言两个大数相乘

//#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;

//该位的最后结果

}

}

C语言 大数乘法

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

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

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

这个是ASCII码的表 你看下就应该明白了

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();

}

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;i256;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;

}


网站名称:C语言大数相乘函数,c语言大数相乘的算法
当前地址:http://cdxtjz.cn/article/hcedhs.html

其他资讯