N!

news/2025/2/14 2:07:15/
Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 83308    Accepted Submission(s): 24528


Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!

Input
One N in one line, process to the end of file.

Output
For each N, output N! in one line.

Sample Input
  
1 2 3

Sample Output
  
1 2 6

Author
JGShining(极光炫影)
(题目来源于hdu http://acm.hdu.edu.cn/showproblem.php?pid=1042)

解题思路

围绕了大数乘法这个理念,我在这里运用了两种方法。。。。。。

一个是利用了字符串来进行模拟乘法,另外一种则是利用了大数组来储存n!每一位的数字然后进行模拟


利用字符串来进行模拟

这种做法不是最好的但是我觉得挺好理解的所以想和大家分享一下~

这里我需要用到大数加法的知识,所以如果还没有了解大数加法的同学可以去我的博客里面看一下大菲波数那篇文章噢!

好啦,言归正传,我想问问大家对于乘法有什么理解。

比如说1236548*5124;

首先,我们会把位数小的放在下面,类似于

1236548

      5124

------------

这样子对吧,然后我们用4来乘8,得32,在小横杠上写上一个3,然后4*4=16,16+3=19,在小横杠上写一个1......

我们的大数乘法就是模拟这一种方法!

string mulSingle(string s, char a)//计算单个乘积(这里的char其实就是我们提取,类似5124,提取4、2、1、5
{int sum = 0;int flag = 0;string part;for (int i = s.size() - 1; i >= 0; i--){int sum = flag + (a - '0')*(s[i] - '0');//是指你的进位数 例如4*8=32,flag=3part = part + char(sum % 10 + '0');//%10是取进制后的数字,例如32%10=2;flag = sum / 10;if (i == 0)part = part + char(flag + '0');//例如4*8236548乘完了每一位数字,最后还有进制,则相对应加上for (int i = 0; i < part.size() / 2; i++)//进行转置{char tmp = part[i];part[i] = part[part.size() - 1 - i];part[part.size() - 1 - i] = tmp;}}return part;
}

小伙伴们肯定发现了,这里只是处理了一次啊,1236548*5124还有2、1、5没有处理呢

string mulAll(string s, string s2)
{string tmp;string all;for (int i = s2.size() - 1, k = 0; i >= 0; i--, k++){tmp = mulSingle(s, s2[i]);//对5124的每一位都进行这样子的操作for (int j = 0; j < k; j++){tmp = tmp + '0';}all = add(tmp, all);}return all;
}

上面程序的重点

		for (int j = 0; j < k; j++){tmp = tmp + '0';}
为什么要这样子做?因为类似12*25

                        12

                        25

------------------------

                        60                                         60

                       24(注意这里有偏位)等价于240

-------------------------

                        300


我想你应该能明白为什么要这样子写了


利用大数组来储存n!的每一位进行模拟乘法

具体的思路就是

每一位的储存起来,然后利用i(i从2一直自增到n)乘每一位数字,然后模拟进制!

在这里我想跟大家探讨一下乘法的新角度

例如

756*5

            7 5 6

                  5


-----------------

我想很多人都是,30,进3,25,25+3=28,进2,7*5=35,35+2=37进3,最后答案就是3780

但是大家有没有想过,我们其实可以先都算出来

(35)(25)(30)

这样子,首先(35)(28)0

然后(37)80

最后3780

有没有发现!完全一样!

这也是我们这种观法的特别之处!

我们的数组的每一个下标,都是一个int!可以超过10的!这样子操作真的太方便了!

最后还有一个细节,就是我们如何初始化我们的数组,大家可以思考一下。0?

最后贴上代码,分别对应了字符串和数组的两种算法。

http://paste.ubuntu.com/25233762/

http://paste.ubuntu.com/25233754/


最后,字符串算法无法处理到10000,但是数组算法是妥妥的~我也不知道为什么。。。。。。可能string【10000】太大了。。。。。。

这个我先和别的同学、前辈多交流,交流完后即时和大家汇报~

大家也可以和我说说你们的看法噢!


http://www.ppmy.cn/news/397524.html

相关文章

杭电--N!(大数)

N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 64556 Accepted Submission(s): 18431 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one li…

极光炫影d acm

http://kennyblog.yculblog.com/archive.115560.html

「深度学习之优化算法」(六)遗传算法

1. 遗传算法简介 遗传算法(Genetic Algorithms&#xff0c;GA)是一种模拟自然中生物的遗传、进化以适应环境的智能算法。由于其算法流程简单&#xff0c;参数较少优化速度较快&#xff0c;效果较好&#xff0c;在图像处理、函数优化、信号处理、模式识别等领域有着广泛的应用。…

Kafka学习---4、消费者(分区消费、分区平衡策略、offset、漏消费和重复消费)

1、消费者 1.1 Kafka消费方式 1、pull&#xff08;拉&#xff09;模式&#xff1a;consumer采用从broker中主动拉取数据。 2、push&#xff08;推&#xff09;模式&#xff1a;Kafka没有采用这种方式。因为broker决定消息发生速率&#xff0c;很难适应所有消费者的消费速率。…

C语言之指针详解(3)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析、 4. 数组参数、指针参数 我们来看一维数组传参 #include<stdio.h> void test(in…

Selenium基本用法

Selenium 提供了 8 种定位单个节点的方法&#xff0c;如下所示&#xff1a; 定位节点方法 方法 说明 find_element_by_id() 通过 id 属性值定位 find_element_by_name() 通过 name 属性值定位 find_element_by_class_name() 通过 class 属性值定位 find_element_by_tag_name()…

摩托罗拉展示远程充电 1米有效范围内可充数台手机

Motorola官方发布了关于motorola隔空充电技术的演示影片。片中将两部motorolaedge手机放在距离充电器1米与80厘米处&#xff0c;手机便可自动充电。 联想中国区手机业务部总经理"神奇的劲哥"还表示&#xff0c;motorola的隔空充电距离&#xff0c;已经可以做到远大于…

RK3399 Android7.1电池一直无法充满,只能充到99%

charger&#xff08;充电芯片&#xff09;驱动里一般需要设置电池的充电电压&#xff08;即满充电压&#xff09;&#xff0c;如果设置的满充电压低于或高于电池实际满充电压&#xff0c;那么电池就会出现充不满电的情况。 比如电池满充电压为8.7V&#xff0c;但charger设置满…