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://ybzwz.com/article/hcedhs.html