P1009 [NOIP 1998 普及组] 阶乘之和
题目描述
用高精度计算出 (
)。
其中 !
表示阶乘,定义为 。例如,
。
输入格式
一个正整数 。
输出格式
一个正整数 ,表示计算结果。
输入输出样例 #1
输入 #1
3
输出 #1
9
说明/提示
【数据范围】
对于 的数据,
。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 ,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。
NOIP1998 普及组 第二题
解题思路
高精加+斐波那契数列
AC代码
#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
#define lowbit(x) = ((x) & -(x))
#define rep_0(a, b, c) for (int a = b; a < c; a++)
#define rep_1(a, b, c) for (int a = b; a <= c; a++)
#define per(a, b, c) for (int a = b; a >= c; a--)
using namespace std;
string solve_a_add_b(string a, string b)
{
vector<int> ans;
stack<int> ans_a;
stack<int> ans_b;
for (int i = 0; a[i]; i++)
{
ans_a.push(a[i] - 48);
}
for (int i = 0; b[i]; i++)
{
ans_b.push(b[i] - 48);
}
while (!ans_a.empty() && !ans_b.empty())
{
int temp_a, temp_b;
temp_a = ans_a.top();
ans_a.pop();
temp_b = ans_b.top();
ans_b.pop();
ans.push_back(temp_a + temp_b);
}
if (!ans_a.empty())
{
while (!ans_a.empty())
{
ans.push_back(ans_a.top());
ans_a.pop();
}
}
else if (!ans_b.empty())
{
while (!ans_b.empty())
{
ans.push_back(ans_b.top());
ans_b.pop();
}
}
for (int p = 0; p < ans.size() - 1; p++)
{
if (ans[p] >= 10)
{
ans[p + 1] += ans[p] / 10;
ans[p] = ans[p] % 10;
}
}
while (ans.back() >= 10)
{
int num = ans.back();
ans.push_back(num / 10);
ans[ans.size() - 2] = num % 10;
}
string s = "";
for (int i = ans.size() - 1; i >= 0; i--)
{
s += to_string(ans[i]);
}
return s;
}
void solve()
{
int n;
cin >> n;
vector<string> a;
a.push_back("1");
a.push_back("1");
a.push_back("2");
for (int i = 3; i < n; i++)
{
a.push_back(solve_a_add_b(a[i - 1], a[i - 2]));
}
cout << a[n - 1] << endl;
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
while (t--)
{
solve();
}
return 0;
}
package main
import (
"fmt"
)
func addStrings(a, b string) string {
i, j := len(a)-1, len(b)-1
carry := 0
result := ""
for i >= 0 || j >= 0 || carry > 0 {
sum := carry
if i >= 0 {
sum += int(a[i] - '0')
i--
}
if j >= 0 {
sum += int(b[j] - '0')
j--
}
result = string(sum%10+'0') + result
carry = sum / 10
}
return result
}
func main() {
var n int
fmt.Scan(&n)
a := []string{"1", "1", "2"}
if n <= 3 {
fmt.Println(a[n])
return
}
for i := 3; i <= n; i++ {
a = append(a, addStrings(a[i-1], a[i-2]))
}
fmt.Println(a[n])
}
n = int(input())
a,b=1,1
for i in range(n):
a,b=b,a+b
print(a)