蓝桥杯 BASIC 30 阶乘计算(大数)

【思路】:大数基本都是这思路,采用数组或者字符串,每个数采用倒序的方式从头开始存储。每次进位进到下一位上。

【AC代码】:两个数组来回颠倒。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;

#define MAX 3000

int cal(int *s, int len, int n, int *d)
{
	int i = 0, temp = 0;
	for (i = 0; i < len; i++)
	{
		temp = s[i] * n + temp;
		d[i] = temp%10;
		temp = temp/10;
	}
	while (temp)
	{
		d[i++] = temp%10;
		temp = temp/10;
	}
	return i;
}

void output(int *s, int len)
{
	int i = 0;
	while (len)
	{
		cout << s[--len];
	}
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int n =0, i = 0, j = 1, k = 0;
	int s1[MAX]={1}, s2[MAX];
	cin >> n;
	for (i = 1; i <= n; i++)
	{
		if (j > 0)
		{
			k = cal(s1, j, i, s2);
			j = 0;
		}
		else
		{
			j = cal(s2, k, i, s1);
			k = 0;
		}
	}
	if (0 == n%2)
		output(s1, j);
	else
		output(s2, k);
}

【AC代码2】:一个数组。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;

#define MAX 3000

int cal(int *s, int len, int n)
{
	int i = 0, temp = 0;
	for (i = 0; i < len; i++)
	{
		temp = s[i] * n + temp;
		s[i] = temp%10;
		temp = temp/10;
	}
	while (temp)
	{
		s[i++] = temp%10;
		temp = temp/10;
	}
	return i;
}

void output(int *s, int len)
{
	int i = 0;
	while (len)
	{
		cout << s[--len];
	}
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int n =0, i = 0, len = 1;
	int s1[MAX]={1};
	cin >> n;
	for (i = 1; i <= n; i++)
	{
		len = cal(s1, len, i);
	}
	output(s1, len);
}
时间: 2024-10-18 08:33:49

蓝桥杯 BASIC 30 阶乘计算(大数)的相关文章

蓝桥杯 BASIC 30 高精度加法(大数)

[思路]:大数处理都一样. [AC代码]:代码细节可以美化一下. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <iomanip> using namespace std; #define MAX 100+10 int main() { //freopen("in.

蓝桥杯 基础练习 阶乘计算

问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推. 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位. 首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值. 输入格式 输入包含一个正整数n,n<=1000. 输出格式 输出n!的准确值. 样例输入 10 样例输出 3628

蓝桥杯-算法提高-日期计算

算法提高 日期计算 时间限制:1.0s   内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情况. 输入格式 输入只有一行 YYYY MM DD 输出格式 输出只有一行 W 数据规模和约定 1599 <= YYYY <= 2999 1 <= MM <= 12 1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期 1 <= W &

蓝桥杯--算法训练 区间k大数查询

算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数. 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个.序列元素从1开始标号. 输出格式 总共输出m行,每行一个数,表示询问的答案. 样例输入 51 2 3 4 521 5

蓝桥杯 BASIC 27 矩阵乘法(矩阵、二维数组)

[思路]:注意0次幂是单位矩阵. [AC代码]: #include <iostream> #include <algorithm> #include <iomanip> #include <cstdio> #include <cstring> using namespace std; #define MAX 30+2 void cal(int m[MAX][MAX], int t[MAX][MAX], int r[MAX][MAX], int N

蓝桥杯练习系统 表达式计算

题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. 上代码: 1 #include<stack> 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 i

蓝桥杯 BASIC 22 FJ的字符串(递归、字符串)

[思路]:递归的使用. [AC代码]: #include <iostream> #include <algorithm> #include <iomanip> #include <cstdio> #include <cstring> using namespace std; void fj(int n) { if (1 == n) { cout << char('A'-1+n); } else { fj(n-1); cout <

蓝桥杯 BASIC 16 分解质因数(数学)

[思路]:先打表,后循环. [AC代码]: #include <iostream> #include <algorithm> #include <iomanip> #include <cstdio> #include <cmath> using namespace std; #define MAX 10000 int prime_list[MAX], cnt = 0; int isPrime(int n) { int i = 0; for (i

蓝桥杯 BASIC 24 龟兔赛跑预測(模拟)

[思路]:模拟.注意一个是在兔子歇息的时间乌龟可能到达了.刚開始没考虑WA80%. [AC代码]: #include <iostream> #include <algorithm> #include <iomanip> #include <cstdio> #include <cstring> using namespace std; int main() { //freopen("in.txt", "r",