计算10000以内的阶乘
/* Factorial.c -- 计算大数的阶乘
* Author: Space
* Date: 2007/07/03
* Version: 1.0
*/
#include<stdio.h>
#include<stdlib.h> // for malloc()
#include<string.h> // for memset()
#define QUOTIETY 4
// 内存分配系数,计算10000以内阶乘设置为4就足够,如果需要
// 计算更大的数的阶乘,则将该系数适当增大
void process(const int index, int *result);
int cnt = 1;
int main(void)
{
int index = 0;
int input = 0;
int *result = NULL;
// 获得输入数据
printf("请输入你要计算的阶乘数,内存有限,请不要超过10000:\n");
scanf("%d", &input);
while (input <= 0 || input > 10000)
{
printf("请输入合理的数据,谢谢:\n");
scanf("%d", &input);
}
// 申请空间储存计算结果
result = (int *)malloc(sizeof(int) * input * QUOTIETY);
if (result == NULL)
{
printf("内存申请失败!\n");
exit(-1);
}
memset(result, 0, sizeof(int) * input * QUOTIETY); // 初始化存储空间
result[0] = 1;
// 进行阶乘计算
for ( index = 1; index <= input; ++index)
{
process(index, result);
}
// 打印结果
for (index = cnt - 1; index >= 0L; --index)
{
printf("%d", result[index]);
}
putchar('\n');
printf("结果一共有%d位数!\n", cnt);
free(result);
system("pause");
return 0;
}
/*
* 计算阶乘核心代码
*/
void process(const int index, int *result)
{
int product = 0; // 乘积
int carry = 0; // 进位
int remainder = 0; // 余数
int i = 0;
for (i = 0; i < cnt; ++i)
{
product = result[i] * index + carry;
carry = product / 10;
remainder = product % 10;
result[i] = remainder;
}
if (carry != 0)
{
while (carry / 10 != 0)
{
result[cnt] = carry % 10;
carry /= 10;
++cnt;
}
result[cnt++] = carry;
}
}
有一些又是求一个数N!中末尾有多少个0?
这是我的思路
int count(int n)
{
int count=0;//计数器
int total =1;//乘积结果
for(int i =1; i<=n;i++)
{ total = i*total;
if(total%10==0)
{
count++;
total=total/10;
}
}
return count;
}
另一个算法:
就是寻找整除5的数
int First()
{
int ret = 0;
int j=0;
for(int i=1; i<=N;i++)
{
j=i;
while(j%5==0)
{
ret++;
j=j/5;
}
}
return ret;
}
int Second(int N)
{
int ret=0;
while(N)
{
ret=ret+N/5;
N=N/5;
}
return ret;
}
分享到:
相关推荐
2. "例3-19for求阶乘.sln" - 这是Visual Studio解决方案文件,用于管理一个或多个相关项目的集合,通常包含了项目设置和引用信息。 3. "例3-19for求阶乘" - 这可能是源代码文件,很可能包含用C#、C++或其他支持for...
在编程领域,阶乘是一个常见的数学概念,通常...总的来说,数组求N的阶乘是基础的算法实现,它有助于我们理解递归、循环以及数组在解决问题中的应用。在实际编程中,我们应根据具体需求和资源限制选择合适的计算方法。
ArrayList是C#中用于动态数组的一种集合类型,它可以存储任意类型的对象,包括自定义的数字类,这使得它成为处理大数的理想选择。 实现大数阶乘的非递归算法通常涉及到迭代的方式,逐个乘以前面计算出的所有数。...
用递归法求N的阶乘 程序调用自身称为递归( recursion).它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解. 递归的能力在于用有限的语句来定义对象的无限集合。 一般来说,递归需要有...
链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键角色,特别是在处理动态数据集合时。在本示例中,我们关注的是双向链表的实现,它用于计算大数阶乘。这个初级学习范例是为初学者设计的,帮助他们理解和...
)是计算一个正整数n的所有小于等于n的正整数乘积,而排列组合则是解决如何从给定元素集合中选择特定数量的元素,考虑顺序或者不考虑顺序的问题。 首先,我们来详细解释阶乘。阶乘在数学上定义为n! = n × (n-1) ×...
此外,可能还会使用到数组或集合来存储历史计算记录,或者实现科学计算模式下的对数、指数、平方根等高级功能。 对于初学者来说,这个项目是一个很好的起点,可以帮助他们掌握C#的基本编程技巧,了解如何构建GUI...
例如,如果你需要找出一个集合中的所有可能组合或排列,或者需要计算特定数量的组合或排列数,这些函数都是极其有用的工具。同时,`doc+函数名` 的命令可以用来查看MATLAB官方的帮助文档,获取更详细的信息和示例。
这些算法涵盖了从简单的计数、求和、求阶乘到更复杂的任务,如寻找最大公约数、最小公倍数,甚至判断素数。以下是对这些常见算法的详细解释: 1. 计数、求和、求阶乘: 在VB中,计数、求和和求阶乘通常涉及循环...
例如,对于集合{1, 2, 3},有6种不同的排列:123, 132, 213, 231, 312, 321。生成排列可以使用回溯算法或堆排序等方法。 整数划分是指将一个正整数n划分为若干个正整数的和,要求这些正整数互不相同。例如,将7划分...
阶乘matlab代码 MATLAB /八度 这些存储库是在MATLAB / Octave中构建的有用算法和数据结构的集合。 此外,您还将从项目欧拉问题集中找到解决方案。 该存储库中的代码是针对MATLAB和Octave的跨portabel。 什么是八度...
【二维数组基本操作】在本实验中,二维数组被用于实现一些基本的计算任务,如求阶乘和稀疏数组的压缩。二维数组是线性代数中的基本元素,尤其在处理矩阵运算时非常常见。它是一种数据结构,用于存储具有固定大小的...
8. **递归算法**:递归是解决一些具有自相似性质问题的有效手段,如阶乘计算、汉诺塔问题、树的遍历等。 9. **字符串处理**:KMP算法用于字符串匹配,Boyer-Moore算法是另一个高效的字符串搜索算法。此外,还有字符...
- 满射的个数计算涉及到排列,当Y的大小大于等于X时,从X到Y的满射个数等于Y的大小减去X的大小再乘以Y的大小的阶乘除以X的大小的阶乘(第5题)。 6. **集合运算**: - 两个集合的并集、交集、差集和补集的运算...
数组 实现一个支持动态扩容的数组 实现一个大小固定的有序数组,支持动态增删改操作 实现两个有序数组合并为一个有序数组 链表 实现单链表、循环链表、双向链表,支持...编程实现求阶乘n! 编程实现一组数据集合的全排列
数组实现一个支持动态扩容的数组实现一个大小固定的有序数组,支持动态增删改操作实现两个有序数组合并为一个有序数组链表实现单链表、循环链表、双向链表,支持增删操作实现单链表反转实现两个...-2)编程实现求阶乘n...
这里有两种不同的方法来求1到100的整数之和。第一种使用`goto`语句,虽然在现代编程实践中不推荐使用,但在这里演示了如何利用它构建一个无限循环。第二种方法使用`do-while`循环,先执行一次循环体,然后检查条件...
此题涉及高精度计算,要求求出一个大数的阶乘最后一位非零数字。可以使用数学方法,例如模运算,避免直接计算大数的阶乘。对于n!,可以先计算n与(n-1)!的模20的余数,然后用这个余数乘以n再取模20,以此类推,直到n...
递归是函数调用自身的一种技术,用于解决复杂问题,例如阶乘、树的遍历等。Java中使用递归需要注意防止栈溢出。 3. 委托和事件:虽然这是.NET的特性,但Java中有类似的概念。Java中的接口可以视为委托,它们定义了...