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

}

我用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 = 0i <ni ++ )

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 = 0i <digits - 1i ++ ) {

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 = 0i <dai ++ ) {

/*乘*/

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 = 0i <10000i ++ ) {

if ( a[i] != '\0' ) {

a[i] = CharToNum( a[i] )

}

}

for ( i = 0i <20000i ++ ) {

if ( c[i] != '\0' ) {

c[i] = CharToNum( c[i] )

}

}

/*这个乘法算法可以参看二进制乘法器的原理*/

for ( i = 0i <dbi ++ ) {

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

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存