c++ - 使阶乘程序更快?
问题描述
我一直在尝试将此提交到一个有编程课程的网站,但法官一直告诉我这个程序执行时间太长:/
问题陈述:
编写一个程序,从标准输入中读取一个非负整数
n
,计算十进制数和十进制中的个数n!
,并将结果写入标准输出。在输入的第一行有一个 integerD (1≤D≤30)
,表示要考虑的案例数。对于每个条目的情况。您的程序应该在单独的行上打印两个数字(由一个空格分隔):n!
十进制系统中的十位和个位。
输入输出:
输入 | 输出 |
---|---|
2 | |
1 | 0 1 |
4 | 2 4 |
#include <iostream>
using namespace std;
int d,n;
int main()
{
cin>>d;
for(int i=0; i<d; i++)
{
cin>>n;
int silnia = 1;
for(int j=n; j>1; j--)
{
silnia=silnia*j;
}
if(silnia == 1) cout<<0<<" "<<silnia<<"\n";
else cout<<(silnia/10)%10<<" "<<silnia%10<<"\n";
}
return 0;
}
解决方案
您可以摆脱内部循环,因为n! == (n - 1)! * n
:
cin >> d;
int factorial = 1;
cout << 0 << " " << 1 << "\n";
for (int i = 1; i < d; ++i) {
/* we operate with last two disgits: % 100 */
factorial = (factorial * i) % 100;
cout << factorial / 10 << " " << factorial % 10 << "\n";
}
编辑:另一个问题是
silnia=silnia*j;
线。阶乘增长迅速:
13! = 6227020800 > LONG_MAX (2147483647)
这就是为什么我们应该使用模算术:我们不保留阶乘本身(可能非常大),而是保留它的最后两个数字(注意% 100
),保证在00..99
范围内:
factorial = (factorial * i) % 100;
甚至(如果i
可以很大)
factorial = (factorial * (i % 100)) % 100;
推荐阅读
- javascript - 你能提供一个带有 zone.js 的自定义 shim/patch 吗?
- python - Sentence detection - In first sentence find two NP and then go to the next sentence
- javascript - 初始化后无法更改注释图像属性
- c++ - Apparent ambiguity error with std::vector but it still compiles
- python - Script continues running after destroy() tkinter
- python - Legend displayed only for a subset of curves in plot
- node.js - How to run testcafe via node
- awk - add special characters in a text using awk
- angular - angular 6 return result of forkJoin subscribe (rxJs 6)
- database - 如何使用带有过滤器的laravel分页