大数的阶乘算法

大数的阶乘算法用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue响应式原理理解

    vue响应式原理理解要理解响应式原理,首先要理解两个问题,数据改变后,Vue是如何监听的,要通知哪些人然后进行界面的刷新首先来理解一下下面这这个监听数值改变与监听获取数据的函数,首先创建一个对象,然后这个对象就是用来被监听的,首先使用forEach来把对象里面所有的值取出来放到value这里,然后再defindeProperty里面重新定义,这个方法里面有一个set和get方法,分别是处理监听数据改变和数据被获取…

    2022年5月1日
  • mqtt服务器搭建php,Windows搭建MQTT服务器

    mqtt服务器搭建php,Windows搭建MQTT服务器MQTT,是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备:轻量级的消息订阅和发布(publish/subscribe)协议建立在TCP/IP协议之上物联网,MQTT在这方面应用较多这里MQTT分客户端服务器端网上的确有很多代码,但是服务器端的配置很少,而MQTT是通过TCP/IP协议连接的,MQTT是协议类型HTTP协议一样,也需要对应的服…

    2022年5月8日
  • C语言fread函数_C语言fread

    C语言fread函数_C语言freadc语言中fread函数C语言中的fread()函数(fread()functioninC)Prototype:原型:size_tfread(void*buffer,size_tlength,size_tcount,FILE*filename);Parameters:参数:void*buffer,size_tlength,si…

    2022年9月12日
  • Codeforces Helpful Maths

    Codeforces Helpful Maths

    2022年1月2日
  • VBoxManage常用命令「建议收藏」

    VBoxManage常用命令「建议收藏」目录0x01常用命令0x02全部参数0x01常用命令#列出全部虚拟机VBoxManagelistvms#列出全部运行中的虚拟机VBoxManagelistrunningvms#列出虚拟机信息VBoxManageshowvminfouuid|vmname#开启虚拟机VBoxManagestartvmuuid|vmname#…

    2022年4月29日
  • Hadoop生态圈hive应用

    Hadoop生态圈hive应用第1章Hive基本概念1.1什么是HiveHive:由Facebook开源用于解决海量结构化日志的数据统计。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。1.2Hive的优缺点1.2.1优点1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。2)避免了去写MapReduce,减少开发人员的学习成本。3)Hive的执行延迟比较高,因此Hive常用于数

    2022年5月11日

发表回复

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

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