大数的阶乘算法

大数的阶乘算法用data数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。例如求5!的值步骤一:1!=1位数1数组内容0     0     0     1步骤二:2!=2

大家好,又见面了,我是你们的朋友全栈君。

  用data数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。
例如求5!的值
步骤一:
1!=1
位数1
数组内容0      0      0      1
步骤二:
2!=2*1!=2
位数1
数组内容0      0      0      2
步骤三:
3!=3*2!=3*2=6
位数1
数组内容0      0      0      6
步骤四:
4!=4*3!=4*6=24
位数1
数组内容0      0      0      24
因为24大于10,需要进位
data[1]=data[1]+data[0]/10=0+2=2
data[0]=data[0]%10=4
所以数组内容为0      0      2      4
位数2
步骤五:
5!=5*4!=5*24=120
位数2
数组内容为0      0      2*5      4*5
即0      0      10      20
因为data[0]大于10,需要进位
data[1]=data[1]+data[0]/10=10+2=12
data[0]=data[1]%10=0
此时数组内容为0      0      12      0
data[2]=data[2]+data[1]/10=0+1=1
data[1]=data[1]%10=2
位数加1
数组内容为0      1      2      0
一次类推,可以计算大数的阶乘,代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#define MAX 100

void factorial(int n,char output[])
{
	int i = 0, j = 0;
	int cin = 0, tmp = 0;
	int result[MAX] = {0};

	result[0] = 1;
	for(i = 2; i <= n; i++)
	{
		cin = 0;
		for(j = 0; j < MAX; j++)
		{
			/*120x7 = 0x7 + 2x7x10 + 1x7x100 */
			/*           7 cin=0   4 cin=1      0 cin=7 */
			tmp = result[j]*i + cin;
			result[j] = tmp % 10;
			cin = tmp / 10;
		}
	}

	for(i = MAX - 1; i >= 0; i--)
	{
		if(result[i] != 0)
		{
			break;
		}
	}

	for(j = i; j >= 0; j--)
	{
		sprintf(output++, "%d", result[j]);
	}
}

int main()
{
	int i = 0;
	long long result = 1;
    char out[MAX]={0};

	factorial(20,out);

	printf("result:%s\n", out);

	return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164004.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月24日 上午6:46
下一篇 2022年7月24日 上午6:46


相关推荐

  • 反射之invoke方法

    反射之invoke方法当获得类对应的Class对象后,可以通过getMethods()方法得到全部方法——返回Method数组,或者getMethod()方法来获取指定方法——Method对象。可以通过Method对象的invoke()方法来调用它对应的方法。Objectinvoke(Objectobj,Object…args):obj是执行该方法的Class对象,args是执行该方法时传入的实参。

    2022年5月20日
    39
  • 博途scl编程实例_博途plc编程流程

    博途scl编程实例_博途plc编程流程SCL:StructuredContorlLanguage,结构化控制语言。在TIA博途软件中,默认支持SCL语言,在建立程序块时可以直接选择SCL语言。SCL语言类似计算机高级语言,如果你有C、Java、C++、Python这种高级语言的学习经历,再学习SCL就会容易很多。在用SCL语言编程时,主要用IF…THEN/FOR/WHILE语句去构造条件、循环、判断这样的结构,在这些结构中再次添加指令,去实现逻辑判断。所有程序的编写都是在纯文本的环境下编辑,不像梯形图那么直观。能把

    2022年10月7日
    4
  • 小白新手必看的OpenClaw教程,超高性价比OpenClaw攻略!

    小白新手必看的OpenClaw教程,超高性价比OpenClaw攻略!

    2026年3月13日
    2
  • OpenClaw重塑AI互動生態 業界:中國AI企業握彎道超車契機 國際化佈局提速

    OpenClaw重塑AI互動生態 業界:中國AI企業握彎道超車契機 國際化佈局提速

    2026年3月12日
    2
  • 第3章-线性概率模型(1)-logistics/probit模型

    第3章-线性概率模型(1)-logistics/probit模型二值因变量模型在统计学中 有一种离散变量为二值变量 又称虚拟变量 哑变量 本文讨论的是当因变量 y 为二值变量时的模型 Logistic 模型也是一种二值因变量模型 探讨 Logistic 模型之前 我们先从线性概率模型 LinearProbab LPM 谈起 然后逐步介绍 Logistics 模型以及其他非线性模型

    2026年3月19日
    6
  • 确定手机imsi号码的方法

    确定手机imsi号码的方法目录 1 Imsi 概述 12 获得 imsi 的两种方法 22 1 读卡器读出 sim 卡上 imsi22 2 利用 wireshark 获得 imsi22 3wireshark 获得 imsi 的具体过程 22 3 1 拷贝抓包服务器软件 rpcapd 到 fcs 的服务器 linux 目录 usr bin 下 22 3 2Fcs 服务器里运行加载 rpcap 抓包服务器进程 52

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号