C语言经典例题:求10000以内n的阶乘

求10000以内n的阶乘

一、题目

 

 

 

二、思路

经过测试,用long long类型也无法记录下测试样例中的阶乘,所以我们要借助数组来存储输出样例中的大数,难点在于怎么样存储在数组里呢?

三、如何将大数存储在数组里

首先我们要先弄清楚十进制相乘的过程。
以1666为例:

 

 

 首先是66得到36,因为是十进制,所以一位的大小要小于十,所以就发生了进位。

 

 

 

第二位的数字为36+3=39,因为是十进制,所以一位的大小要小于十,所以就发生了进位。

所以我们不难看出在运算过程中是先计算完本位与要乘的数相乘,随后在加上一位进位的数,再发生进位

代码的实现

for (int i = 1; i <= n; i++)     {         for (int j = 0; j < 10000; j++)         {             arr[j] = arr[j] * i + b;             b=arr[j]/10;//要进位的数             arr[j] = arr[j] % 10;         }     }

整体逻辑的实现

include<stdio.h> #include<string.h> #pragma warning(disable:4996) int main() {     int n;     scanf("%d", &n);     if(n==0)     {     printf("0");     return 0;     }     int arr[10000] = { 0 };      arr[0] = 1;     int a = n;     int b = 0;     int c = 0;     for (int i = 1; i <= n; i++)     {         for (int j = 0; j < 10000; j++)         {             arr[j] = arr[j] * i + b;             b=arr[j]/10;//要进位的数             arr[j] = arr[j] % 10;         }     }     int size = 9999;     while (arr[size] == 0)     {         size--;     }     for (int i = size; i >= 0; i--)     {         printf("%d", arr[i]);     }     return 0; }

存在的问题和反思

1.在一开始的时候,数组没有初始化,导致在寻找首数字的时候出错了,以后一定要记得初始化数组

2.记得要考虑特殊情况,(n==0)的时候。

3.一定要缕清楚整个进位的过程和方法。

4.while(arr[size–]==0)是不论判断真假,最后都要size–的。

推荐这些技术文章:

C语言练习---1

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<limits.h>
#include<stdlib.h>//system
#include<string.h>//strcmp

int main()
{
int a = 3;
int b = 5;
...

C语言练习 -- 8

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

void test(int arr[])
{
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sz);
}

int main()
{
int arr[10] = { 0 };
tes...

Java数组经典例题

数组中元素的求和

public class T02 {
public static void main(String[] args) {
int[][]arr=new int[][]{{1,2,3,4,5},{1,2,3,5},{8,9,7}};
int sum=0;
for(int i=0;i< arr.length;i++){
...

C语言练习 -- 6

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
int a = 10;
float f = 10.0;
unsigned char;//0 - 255
signed char;//-128 - 127
return 0;
}

void test(voi...

C语言选择排序

/********
* 函数名:SelectionSort
* 功能:将无序数组从小到大排序
* 参数:
* @arr:指向数组arr的指针
* @size:数组大小
* 返回值:无
* ******/
void SelectionSort(int *arr,int size)
{
if(arr)
{
for(int i=0;i...

经典排序算法(C语言版)

排序
比较

分类

比较排序的时间复杂度的下界O(nlogn)
对于n个待排序元素,在未比较时,可能的正确结果有n!种。在经过一次比较后,其中两个元素的顺序被确定,所以可能的正确结果剩余n!/2种(确定之前两个元素的前后位置的情况是相同,确定之后相当于少了一半的可能性)。依次类推,直到经过m次比较,剩余可能性n!/(2m)种。直到n!/(2m)<=1时,结果只剩余一种。根据斯特灵公式...

C语言插入排序

第一版

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 10
void quick_sort(int arr[], int start, int end);
int partition(int arr[], int ...

LeetCode(C语言) - 283. 移动零

https://leetcode.cn/problems/move-zeroes/
提交代码
void moveZeroes(int* nums, int numsSize){
int diff=0;
int arr[numsSize];
for(int i=0;i<numsSize;i++){
if(nums[i]==0){
diff++;
arr[i] = 0;
...

C语言选择排序数据

 
 

// 选择排序

#include <stdlib.h>

#include <stdio.h>

// 交换两个变量的值。

void swap(int *x,int *y)

{

int itmp=*x;

*x=*y;

*y=itmp;

}

// 采用两层循环实现的方法。

// 参数arr是待排序数组的首地址,len...

C语言:存储类

这是很基础的教程,我只是写给自己看,作为一个学习笔记记录一下,如果正在阅读的你觉得简单,请不要批评,可以关掉选择离开
如何学好一门编程语言

掌握基础知识,为将来进一步学习打下良好的基础。
上机实践,通过大量的例题学习怎么设计算法,培养解题思路。
养成良好的编码习惯,注释一定要写,要不然保你一周后自己写的代码都不认识了。

存储类定义 C 程序中变量或函数的范围和生命周期。通常放置在他们所修饰...

文章标题:C语言经典例题:求10000以内n的阶乘
文章链接:https://www.dianjilingqu.com/3578.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>