当前位置:首页 » 编程语言 » 大数乘法c语言

大数乘法c语言

发布时间: 2025-04-03 23:03:24

c语言链表如何求50阶乘和

计算50的阶乘需要使用大数算法,因为50的阶乘结果非常大,无法直接用标准数据类型存储。具体实现时,可以使用一个数组来存储每一位的数值。以下是一个简单的C语言实现示例:

首先定义一个整数数组a,用于存储阶乘的结果,数组大小至少需要9000位,以确保能够存储50的阶乘结果。

初始化数组a[0]为1,表示阶乘的初始值为1。

从2开始遍历到50,依次将每个数与当前的临时结果相乘。这里的关键在于如何处理乘法和进位。具体步骤如下:

对于每个阶乘元素i,从数组a的首位开始,逐位乘以i,并加上当前的进位。计算结果的每一位,并更新进位。

如果当前位乘法后有进位,则需要将进位加到下一位的乘积中。

如果在乘法过程中产生了新的进位,需要将新的进位值存储到数组的更高位,并增加位数。

最后,将结果数组a中的每一位逆序输出,即可得到50的阶乘。

需要注意的是,实际操作时,要确保数组的大小足够大,以容纳所有可能的进位和乘积。

此外,输出时需要从高位到低位输出数组a中的每一位,以得到正确的阶乘结果。

这种方法虽然可以准确计算出50的阶乘,但处理大量数据时可能会比较耗时。在实际应用中,还可以考虑使用更高效的算法或数据结构来优化计算过程。

㈡ 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;
}

㈢ C语言怎么计算大数阶乘的结果的位数

#include<cstdio>
#include<cmath>

#definepi3.14159265
#definee2.718281828

intmain()
{
intn,num;//所求为n!的位数,num为位数
scanf("%d",&n);

if(n==0)
{
num=1;
}
else
{
num=(int)((0.5*log(2*pi*n)+n*log(n)-n)/log(10))+1;
}

printf("%d",num);
}

使用斯特林公式,n!约等于sqrt(2*pi*n)*(n/e)^n,如不理解需更多信息或者有使用高精度(long long不够)的需求继续追问

㈣ 我想问一下用C语言写大数乘法有什么方法可以计算呢可以由什么想这个计算的方法!

大数乘法基本上是乘法竖式笔算的代码化。

基本功能有3个

  1. 大数的数组表示。

  2. 大数乘以小数,得到大数。

  3. 大数加大数,得到大数。

对于1,其实就是int数组的每个元素存储若干位。比如每个元素保存4个十进制位。[0]存储个十百千,[1]存储万、十万、百万、千万,诸如此类。一个数组保存一个大数。因此需要一个额外的int变量记录当前数组用了多少个元素(类似于字符串长度)。


对于2,“小数”指的是能用一个int保存的数。注意这里只限4个二进制位(和1里提到的位数一致)。

比如1 2345 6789这个数字,[0]保存6789,[1]保存2345,[2]保存1。长度3。

这个大数乘以小数,比如9999,过程就是[0] * 9999,即6789 * 9999 = 6788 3211,积的低四位(%10000)3211保存到积(大数)的[0],剩下6788的进位到[1]。

然后2345 * 9999 =2344 7655,加上刚才进位上来的6788得到2345 4443,其中4443保存到积(大数)的[1]中,2345进位到[2]。

以此类推。


对于3,基本只要一个for,对位相加然后注意进位就行了。


大数乘以大数,其实就是第一个大数先乘以第二个大数的[0](大数乘小数,上面的2),得到一个大数A0;然后第一个大数乘以第二个大数的[1],又得到一个大数A1……最后再将A0、A1、……加起来(也就是大数加法,上面的3)。加的时候要注意,A1的[0]要和A0的[1]对齐,A2的[0]要和A1的[1]和A0的[2]对齐……这个也和我们竖式笔算一样。


PS:上面的算法基本上是“10000进制数”的计算方式。如果数组的每个元素只保存1个十进制位,那就是10进制数。之所以用10000进制,纯粹是程序员感觉上好一些。最有效的利用,是每个int保存2的15次方,也就是32768进制。要注意到,如果用10进制计算的话,程序的计算耗时会变成10000进制的16倍,也就是效率变成1/16。

PS2:用int数组的话,位数最多只能是4位。因为5位数相乘可能得到11位数,超出了int表示范围。

㈤ 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

*/

热点内容
qq密码动态码在哪里设置 发布:2025-04-04 17:20:37 浏览:515
分布式编译cpu数目设置 发布:2025-04-04 17:14:56 浏览:941
开票软件ukey吉林服务器地址 发布:2025-04-04 17:04:55 浏览:459
编译datax源码 发布:2025-04-04 17:00:05 浏览:735
微软安卓插口在哪里 发布:2025-04-04 16:59:08 浏览:56
pythonrecv 发布:2025-04-04 16:49:46 浏览:318
xp安装iisftp 发布:2025-04-04 16:45:05 浏览:159
凌渡选什么配置 发布:2025-04-04 16:41:53 浏览:954
弯管机编程 发布:2025-04-04 16:41:19 浏览:635
fpt服务器ip地址 发布:2025-04-04 16:34:25 浏览:48