计算大数的阶乘 代码详细解释

news/2024/7/8 15:55:11 标签: C++
#include <stdio.h>
#include<stdlib.h>//要使用malloc是要包含此头文件,动态内存分配
#include<math.h>
//因为要求的n比较大,所以正常的整数可能是存储不下的。
//所以需要 使用别的方法。
//这里使用的方法就是建立动态数组,数组的每个元素是一个 0-9 的整数。
//比如10!的结果是3628800   这个动态数组里面存储的就是3 6 2 8 8 0 0 
int main()
{
	int n;
	printf("please input n \n");
	scanf("%d", &n);
	if (n <= 1)
	{
		printf("error:n<=1");
		return 0;
	}
	int len = (int)log10(n) * n;  //结果长度。这里先计算阶乘的计算结果的位数,这样就可以申请数组了。
	if (len == 0) len = n;
	//我数学也不是很好。这里计算阶乘结果的位数 需要 数学知识。
	//这个代码 这里使用的方法 计算出来的位数 是 多了的。最少多0个。
	//和基本的动态建立数组的思想是一致的,往多了建。
	int* sum = (int*)malloc(len * (sizeof(int)));  //这里申请数组了。
	for (int i = 0; i < len; i++)//数组赋值
	{
		sum[i] = 0;
	}
	//先把数组初始化为0
	sum[len - 1] = 1;  //最后一位为1

	//接下来这一段是具体的计算阶乘,并把结果存储在数组的后面几位。即存储元素是从后往前存储的。
	int j;
	int pre = 0;  //递进符号
	for (int i = 2; i <= n; i++)   //为什么从2开始,因为计算阶乘嘛,1不用乘。
	{
		for (j = len - 1; j >= 0; j--)  //这个循环的意思就是用数组的数字 乘以i并加上pre.依次向前,这样可以把超过1位的结果向前传递。
		{
			int temp = pre + sum[j] * i;  //进位加这一位该做的计算。
			pre = temp / 10;  //pre是进位
			sum[j] = temp % 10;  //sum[j]就是这一位本来该存放的数字。
		}
	}

	//你看,它把元素存储在数组的后面,前面的为0的会跳过的。
	j = 0;
	while (sum[j] == 0)j++;
	for (; j < len; j++)
	{
		printf("%d", sum[j]);
	}
	if (sum != NULL) {
		free(sum);
		sum = NULL;
	}
	return 0;
}

http://www.niftyadmin.cn/n/965123.html

相关文章

【Hadoop】 分布式Hadoop集群安装配置

第一次安装hadoop 集群&#xff0c;记录其安装过程&#xff01;1 前期准备&#xff0c;配置所有的机器的/etc/hosts 文件# cat /etc/hosts# Do not remove the following line, or various programs# that require network functionality will fail.127.0.0.1 rac localh…

python 读入图片成固定大小 并存入h5文件

import cv2 import h5py import numpy as npROOT_VOC_DIRECTORY ./VOC2012/# 读取所有图片的名字 def readImageName():namesFile ROOT_VOC_DIRECTORYtrain_image_names.txtallImageNames []fd open(namesFile, "r")for line in fd.readlines():allImageNames.ap…

Monkey学习(1)环境搭建

环境搭建&#xff1a; Monkey程序由Android系统自带&#xff0c;需要配置J2SE平台的JDK&#xff0c;还需要配置Android平台的SDK。 1&#xff09;下载和配置JDK 下载与安装JDK过程省略。。。 配置JDK环境变量&#xff0c;我这里用的是JDK1.7&#xff0c;安装完JDK后配置环境变量…

python 删除某一文件夹下的 大小小于特定值的图片

import os from PIL import Image import glob dir1 ./VOC2012/JPEGImages # 图片文件存放地址paths glob.glob(os.path.join(dir1, *.jpg)) # 输出所有文件和文件夹 for file in paths:fp open(file, rb)img Image.open(fp)fp.close()width img.size[0]height img.size…

【ORACLE】relink oracle 10g 数据库

通常要迁移一个数据库&#xff0c;我们会使用1 冷备份&#xff0c;整个数据库迁移&#xff0c;2 rman duplicate 功能进行复制到本机或者复制到异机&#xff0c;前面两种都必须先在目标库上安装软件。这里测试另外一种方法&#xff1a;对于单实例数据库&#xff0c;复制整个ora…

windows 编译 libharu 我这个是手把手教你

1来源 老板叫我学libharu.这是一个操作pdf的开源库,用C语言编写,一般用于C/C++的项目中。 (题外话:我搜解决方案的时候,最烦的是那种随便写的博客,写的不清不楚,往往照着操作了一遍之后,很多问题没解决,然后又是重新下载,重新清理环境,一切都重新弄,就很烦,但是我…

移动端开发常识

1、“apple-mobile-web-app-status-bar-style”作用是控制状态栏显示样式 --》<meta name"apple-mobile-web-app-status-bar-style" content"black"> 2、这meta的作用就是删除默认的苹果工具栏和菜单栏。 content有两个值”yes”和”no”,当我们…

再次学习C++基础感想(2)

1.运算符重载的本质是函数的重载。运算符重载在C里面很多见。例如我们经常使用的cout<<a<<endl;这个"<<"就是重载的运算符&#xff0c;它本身在C中的含义是逻辑左移运算符。 2.函数类型 operator运算符名称(形参列表){对运算符的重载处理} 3.非常量…