#include <iostream> #include <cstdio> using namespace std; int n, a[101] = {0}, s[101] = {0}; // 高精度乘法 void change(int x) { int g = 0; // 进位值初始化为0 // 从数组的最后一位开始处理到第0位 for (int i = 100; i >= 0; i--) { // 计算当前位的新值:a[i] * x + 进位值 a[i] = a[i] * x + g; // 计算新的进位值:当前位的新值除以10 g = a[i] / 10; // 更新当前位的值为当前位的新值对10取模 a[i] = a[i] % 10; } } // 高精度加法 void qh() { int g = 0; // 进位值初始化为0 // 从数组的最后一位开始处理到第0位 for (int i = 100; i >= 0; i--) { // 计算当前位的新值:s[i] + a[i] + 进位值 s[i] = s[i] + a[i] + g; // 计算新的进位值:当前位的新值除以10 g = s[i] / 10; // 更新当前位的值为当前位的新值对10取模 s[i] = s[i] % 10; } } // 打印结果 void sc() { int w; // 找到数组 s 中第一个非零元素的下标 for (int i = 0; i <= 100; i++) { if (s[i] != 0) { w = i; break; } } // 从第一个非零元素开始打印,直到数组的末尾 for (int i = w; i <= 100; i++) printf("%d", s[i]); } int main() { // 读取输入的整数 n scanf("%d", &n); // 初始化大数 s 和 a 的最高位为 1 s[100] = a[100] = 1; // 从 2 乘到 n for (int i = 2; i <= n; i++) { // 计算 i 的乘积 change(i); // 将乘积加到总和 s 上 qh(); } // 打印结果 sc(); return 0; }
算法高精度(加法&&乘法)
最新推荐文章于 2024-08-26 21:22:40 发布