用高精度方法计算n! ,并显示n!(阶乘)的值。
【问题描述】
对于任意给定的n值(n为整数,且1<=n<=100),计算并显示n!(阶乘)的值。
【样例】
输入:n= 10
输出: 3628800
又输入:n= 20
输出: 2432902008176640000
使用整型数组来存储大数类的每一位,并模拟手工乘法的全过程。。
#include "stdio.h"
#include "stdlib.h"const unsigned int MAX = 10000; //整型数组的最大长度
const long long WIDTHMAX = 1000000000; //整型数组val[MAX]的元素上限
const unsigned int WIDTH = 9; //输出整型数组val[MAX]的元素时的格式宽度,即整型数组val[MAX]的元素的最多位数 typedef struct node
{long long val[MAX]; //用来存储高精度整数 unsigned int size; //整型数组的实际长度
}BigInt;void PrintBigInt(const BigInt & a); //输出大数类
BigInt MulBigInt(const BigInt & a, const BigInt & b); //大数类相乘
BigInt FacBigInt(unsigned int n); //大数类求阶乘void PrintBigInt(const BigInt & a)
{unsigned w;int i;printf("%lld",a.val[a.size-1]);for (i=a.size-2; i>=0; i--){w = WIDTHMAX / 10;while (w > 0){if (a.val[i] >= w)break;printf("0");w /= 10;}printf("%lld",a.val[i]);}printf("\n");
}/*
函数名称:MulBigInt
函数功能:高精度整数乘法
输入参数:const BigInt & a:用整型数组表示的高精度整数被乘数 const BigInt & b:用整型数组表示的高精度整数乘数
输出参数:BigInt:返回用整型数组表示的高精度整数乘积
*/
BigInt MulBigInt(const BigInt & a, const BigInt & b)
{int i,j;BigInt c;if (a.size == 1 && a.val[0] == 0)return a;if (b.size == 1 && b.val[0] == 0)return b;for (i=0; i<MAX; i++) //全部赋初值为0 c.val[i] = 0;for ( i=0, j=0; i<b.size; i++){for (j=0; j<a.size; j++){c.val[i+j] += a.val[j] * b.val[i]; c.val[i+j+1] += c.val[i+j] / WIDTHMAX; c.val[i+j] %= WIDTHMAX; }c.size = i + j;if (c.val[c.size] != 0) //最高位有进位 c.size++;}return c;
}/*
函数名称:FacBigInt
函数功能:高精度整数阶乘
输入参数:unsigned int n:正整数
输出参数:BigInt:返回用整型数组表示的高精度整数阶乘
*/
BigInt FacBigInt(unsigned int n)
{unsigned long long i;BigInt s, c;c.size = s.size = 1;s.val[0] = 1;for (i=2; i<=n; i++){c.val[0] = i;s = MulBigInt(s, c);}return s;
}int main(void)
{BigInt a;unsigned int n;printf("请输入n值:");scanf("%u",&n);a=FacBigInt(n);printf("%u的阶乘为:\n",n);PrintBigInt(a);system("pause");return 0;
}
方法二:
#include<iostream>
using namespace std;#define MAX 1000int main(void)
{int n;while(scanf("%d",&n) == 1 && n >= 0){int i,j;int a[MAX]; //存数运算结果int p , add; //p存储当前结果的位数,add为进位a[1] = 1;p = 1; for(i = 2 ; i <= n ; ++i) //循环与2,3,4.....n相乘{for(j = 1 , add = 0 ; j <= p ; ++j) //让a[]的每位与i相乘{a[j] = a[j] * i + add;add = a[j] / 10;a[j] = a[j] % 10;}while(add > 0) //如果h不为0{a[j] = add % 10;add = add / 10;++j;}p = j - 1; //将当前的位数赋给p}for(i = p ; i >= 2 ; --i) //a[]数组的前面是低位,后面高位{printf("%d",a[i]);}printf("%d\n",a[i]);}return 0;
}
用高精度方法计算n! ,并显示n!(阶乘)的值。相关推荐
- Java黑皮书课后题第6章:6.11(金融应用:计算酬金)编写方法,利用编程练习题5.39中的方法计算酬金。方法头如下所示。编写程序,显示下面表格
6.11(金融应用:计算酬金)编写方法,利用编程练习题5.39中的方法计算酬金.方法头如下所示.编写程序,显示下面表格 题目 题目描述与运行示例 编程练习题5.39(非本题) 破题 5.39处理 主方 ...
- js小数运算出现多为小数问题_js小数计算小数点后显示多位小数的实现方法
首先写一个demo 重现问题,我使用的是一个js在线测试环境[打开] 改写displaynum()函数 function displaynum(){var num = 22.77;alert(num ...
- 用天文方法计算二十四节气
二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的基本知识,以及如何使用VSOP82/87行星运行理论计算二十四节气发生的准确时间. 中国古代历法都是以月亮运行规律为主,严格按照朔 ...
- [转]天文方法计算二十四节气
转自吹泡泡的小猫,原文地址:http://blog.csdn.net/orbit/article/details/7910220 二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的 ...
- 【转】用天文方法计算二十四节气(上)
转载地址:https://blog.csdn.net/orbit/article/details/7910220 二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的基本知识,以及如 ...
- oRbIt 的专栏 用天文方法计算二十四节气(上)
http://blog.csdn.net/orbit/article/details/7910220 二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的基本知识,以及如何使用VSO ...
- 算法系列之十八:用天文方法计算二十四节气(上) .
二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的基本知识,以及如何使用VSOP82/87行星运行理论计算二十四节气发生的准确时间. 中国古代历法都是以月亮运行规律为主,严格按照朔 ...
- 算法系列之十八:用天文方法计算二十四节气(上)
二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的基本知识,以及如何使用VSOP82/87行星运行理论计算二十四节气发生的准确时间. 中国古代历法都是以月亮运行规律为主,严格按照朔 ...
- 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。...
编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...
最新文章
- ggplot2可视化分面图(faceting)使用label_wrap_gen函数设置每个分面图的子图标题自动换行为多行文本(基于设定的当行宽度进行标题文本自动换行)
- 文本深度表示模型Word2Vec 简介 Word2vec 是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想,可以通过训练,把对文本内容的处理简
- Haskell语言实现判断一个整数是否是质数的代码及运行结果
- 键盘敲入 A 字母时,操作系统期间发生了什么...
- 创建虚机时间_云原生虚机应用托管设计篇
- SequoiaDB 系列之五 :源码分析之main函数
- [Beego模型] 三、高级查询
- 关于RocketMQ消费者消费队列的消费起始位置源码分析
- 莫兰迪配色RGB对照表
- CANTest及CANPro软件滤波设置说明
- 普通文件与迅雷、旋风、快车、RayFile的下载地址转换算法
- c语言里面temp是什么文件夹,Temp文件夹是什么?Windows下Temp文件夹可以删除吗?...
- 如何将cocos、spine等骨骼文件转换成Egret引擎使用的 dragonbones的骨骼文件
- TVS管选型详细流程
- flash loader下载使用说明
- Matlab虚拟现实工具箱——没有VRML Editor时的使用办法(应该是Simulink 3D Animation Demo版本的都是这样)
- va_list、va_start和va_end的用法
- 单点登录系统设计及实现
- 两台电脑互传文件你还可以这么做
- 使用eclipse遇到问题:the-package-collides-with-a-type