首页 > 其他分享 >T1173 阶乘和

T1173 阶乘和

时间:2023-08-05 19:11:52浏览次数:51  
标签:int T1173 len -- operator Bigint 阶乘

T1173 阶乘和

题目传送门
首先,题目里说了高精度,那还想什么?
这里介绍一个有亿点点难懂的方法

上课!

第一步

首先,先建立一个结构体来模拟大整数类。结构体不仅可以包含成员变量,还能定义成员函数。
代码如下:

#define maxn 100
struct Bigint
{
    int len,a[maxn];//为了兼顾效率和复杂度,用 len 记录位数,a 记录每个数位
    Bigint(int x=0)//通过初始化,使得这个大整数能够表示整型 x,默认为 0
    {
		memset(a,0,sizeof(a));
		for(len=1;x;len++)
		{
			a[len]=x%10;
			x/=10;
		}
		len--;
	}
	int &operator[](int i)
	{
		return a[i];//重载 [],可以直接用 x[i] 表示 x.a[i],编写时间更加自然
	}
	void flatten(int L)//一口气处理 1 到 L范围内的进位并重置长度
	{
		len=L;
		for(int i=1;i<=len;i++)
		{
			a[i+1]+=a[i]/10;
			a[i]%=10;
		}
		for(;!a[len];)//同 while(len>1 && !a[len])
			len--;//重置长度为有效长度
	}
	void print()//输出
	{
		for(int i=max(len,1);i>=1;i--)
			printf("%d",a[i]);
	}
};

搞定!

第二步

阶乘之和,肯定要求和啊,那就需要一个大整数类求和函数。
如下:

Bigint operator+(Bigint a,Bigint b)//表示两个 Bigint 类型数相加,返回一个 Bigint 类型数
{
	Bigint c;
	int len=max(a.len,b.len);
	for(int i=1;i<=len;i++)
		c[i]+=a[i]+b[i];//计算
	c.flatten(len+1);//答案不超过 len+1 位,所以用 len+1 做一下 “展平 ”处理进位
	return c;
}

阶乘,那也需要求积,类似的,需要一个大整数类求积函数。
如下:

Bigint operator*(Bigint a,int b)//表示 Bigint 类型数与整型变量相乘,返回一个 Bigint 类型数
{
	Bigint c;
	int len=a.len;
	for(int i=1;i<=len;i++)
		c[i]=a[i]*b;//计算
	c.flatten(len+11);//答案不超过 len+1 位,所以用 len+1 做一下 “展平 ”处理进位
	return c;
}

第三步

前面千辛万苦封装结构体,就是为了后面能用的轻松。计算阶乘时,不需要每次循环从 \(1\) 乘到 \(n\),而是用变量,每次乘 \(i\) 并记录即可。
主函数如下:

int main()
{
	Bigint ans(0),fac(1);//分别用 0 和 1 初始化 ans 和 fac
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		fac=fac*i;//模拟题意
		ans=ans+fac;
	}
	ans.print();//输出
}

结束!

最后,贴一下 \(AC\) \(Code\)。

#include<bits/stdc++.h>
#define maxn 100
using namespace std;
struct Bigint
{
    int len,a[maxn];
    Bigint(int x=0)
    {
		memset(a,0,sizeof(a));
		for(len=1;x;len++)
		{
			a[len]=x%10;
			x/=10;
		}
		len--;
	}
	int &operator[](int i)
	{
		return a[i];
	}
	void flatten(int L)
	{
		len=L;
		for(int i=1;i<=len;i++)
		{
			a[i+1]+=a[i]/10;
			a[i]%=10;
		}
		for(;!a[len];)
			len--;
	}
	void print()
	{
		for(int i=max(len,1);i>=1;i--)
			printf("%d",a[i]);
	}
};
Bigint operator+(Bigint a,Bigint b)
{
	Bigint c;
	int len=max(a.len,b.len);
	for(int i=1;i<=len;i++)
		c[i]+=a[i]+b[i];
	c.flatten(len+1);
	return c;
}
Bigint operator*(Bigint a,int b)
{
	Bigint c;
	int len=a.len;
	for(int i=1;i<=len;i++)
		c[i]=a[i]*b;
	c.flatten(len+11);
	return c;
}
int main()
{
	Bigint ans(0),fac(1);
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		fac=fac*i;
		ans=ans+fac;
	}
	ans.print();
}

好了,下课!

走前留个赞吧 QWQ

标签:int,T1173,len,--,operator,Bigint,阶乘
From: https://www.cnblogs.com/cxy-xlf-1003/p/17608450.html

相关文章

  • 实现阶乘的运算
    #include<stdio.h>intmain(){unsignedlonglonginta=1;unsignedlonglongintb=0;unsignedlonglongintc=0;scanf("%llu",&c);getchar();for(b=1;b<=c;b+=1){a=a*b;}pr......
  • Java入门题-20!阶乘
    重要:由于阶乘的特殊性,结果可能过大,最好使用存储范围更大的long处理问题,而不是使用int、short、byte代码:主要利用循环语句解决阶乘问题longtotal=1;for(inti=1;i<21;i++){total*=i;}System.out.println(total);......
  • 阶乘
    #include<iostream>usingnamespacestd;inta(intn){if(n<=2){return1;}returna(n-1)+a(n-2);//a(n-1)*n}intmain(intargc,char**argv){system("pause");intN;cin>>N;cout<<a(N)&......
  • 阶乘后K个零
     思路:首先X阶乘后0的个数等于1-x中包含2,5质因子的个数. 其中2的质因子个数小于5的个数, 所以求0的个数就等于求出质因子5的个数设f(x)为x阶乘后0的个数,则f(x)=x/5+x/5^2+...+x/5^k (此处必然存在一个k使得x<5^k) 且f(x)单调不减本题目是求阶......
  • 数组计算阶乘
    voidfactoral(intN){intarr[5120]={};intmax=0;arr[0]=1;for(inti=0;i<N;i++){for(intj=0;j<5120;j++)arr[j]*=(i+1);for(intj=0;j<5120;j++){if(0<......
  • C语言 【阶乘】
    原#include<stdio.h>intmain(){intn;intsum=1;printf("输入数字:");scanf("%d",&n);for(inti=1;i<=n;i++){sum*=i;}printf("%d的阶乘为%d\n",n,sum);return0;......
  • Python+tensorflow计算整数阶乘的方法与局限性
    本文代码主要演示tensorflow的基本用法。importtensorflowas#创建变量,保存计算结果start=tf.Variable(1,dtype=tf.int64)#初始化变量的opinit_op=tf.global_variables_initializer()#启用默认图withtf.Session()assess:#初始化变量sess.run(ini......
  • 1000的阶乘
    #defineNUM3000#include<stdio.h>intmain(){ intnNum=0; //存储1000阶乘数据: intaryBuff[NUM]={0}; //初始化最数组为下标为0,为1: aryBuff[0]=1; printf("请输入阶乘:\n"); scanf_s("%d",&nNum); //遍历1-nNum的因子: for(inti=2;i<=nNum;i++)......
  • java 阶乘实现
    importjava.text.SimpleDateFormat;importjava.util.Date;publicclassImoocStudent{publicstaticvoidmain(String[]args)throwsException{for(intcounter=0;counter<=10;counter++){//这里写法:把counter,factorial()对应放到......
  • 图解LeetCode——793. 阶乘函数后 K 个零(难度:困难)
    一、题目 f(x) 是 x! 末尾是0的数量。回想一下 x!=1*2*3*...*x,且0!=1 。例如, f(3)=0 ,因为3!=6的末尾没有0;而f(11)=2 ,因为11!=39916800末端有2个0。给定 k,找出返回能满足f(x)=k 的非负整数x 的数量。二、示例2.1>示例1:【输入......