大数的阶乘算法

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


相关推荐

  • xxe漏洞原理与防御

    xxe漏洞原理与防御xml基础知识要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。另外php版本大于5.4.45的默认不解析外部实体XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素为什么使用DTD?通过DTD,您的每一个X…

    2022年5月23日
    34
  • 基于Vue的电商后台管理系统(2)

    基于Vue的电商后台管理系统(2)电商后台管理系统2前言上期已经实现该系统的登陆界面、路由、登录、退出及导航守卫功能,本期将继续完善该系统的以下功能:从后端获取后台列表数据并渲染到前端页面、用户列表的展示、修改、删除和添加。后台页面布局本系统后台将采用ElementUI中的Container布局容器。基本结构如下:代码框架:<el-container><el-header>Header</el-header><el-container><el-a

    2022年6月11日
    32
  • grid web_DataGrid

    grid web_DataGrid首先安装Infragistics.NetAdvantage.for.ASP.NET.2007.Vol.2,然后在选择项中添加UltraWebGrid,使用方法如下:1、添加“总计”值绑定完数据后,添加如下代码UltraWebGrid1.Rows.Add();UltraWebGrid1.Rows.Add();…

    2022年10月6日
    5
  • mysql多表左链接查询

    mysql多表左链接查询mysql多表左链接查询

    2022年4月24日
    46
  • 转-数据校验手段-哈希算法

    转-数据校验手段-哈希算法理解哈希是理解数字签名和加密通信等技术的必要前提。哈希,英文是hash,本来意思是”切碎并搅拌“,有一种食物就叫Hash,就是把食材切碎并搅拌一下做成的。哈希函数的运算结果就是哈希值,通常简

    2022年7月2日
    28
  • Pycharm 安装插件[通俗易懂]

    Pycharm 安装插件[通俗易懂]Pycharm安装插件Pycharm安装插件Pycharm中一些值得安装的插件RainbowBracketsIdeaVimMarkdownNavigatorTranslation如果说编辑器是程序员的武器,那么插件就是装备加成。插件可以让编写代码更加灵活Pycharm安装插件点击file–settings,进入设置找到apperance中的Plugins,在搜索框中搜索想要的插件,然后点击安装即可Pycharm中一些值得安装的插件RainbowBrack

    2022年8月29日
    7

发表回复

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

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