1222 -- 【NOIP1998普及组T2】阶乘求和

用高精度计算出S=1!+2!+3!+…+n! (n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。

这么简单的嘛

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
using namespace std;
int n,len,x;
int a[50001];
int b[50001];

//这道题卡了很久,一开始把加的过程写在了循环里面,不知道为什么错了 
void jiecheng(int s){
	memset(a,0,sizeof(a));
	a[1]=1;
	for(int i=1;i<=s;i++){
		x=0;
		for(int j=1;j<=len;j++){
			a[j]=a[j]*i+x;
			x=a[j]/10;
			a[j]%=10;
			if(x>0&&j>=len) len++; 
		}
	}
}
void  jia(){
	for(int j=1;j<=len;j++){
		b[j]+=a[j];
		b[j+1]+=b[j]/10;
		b[j]%=10;
		if(b[j+1]>0&&j==len) len++; 
	}
}
int main(){
	cin>>n;
	len=1;
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++){
		jiecheng(i);
		jia();
	}
	for(int i=len;i>=1;i--) cout<<b[i];
return 0;
}

  

1223 -- 【NOIP1998普及组T3】2的幂次方

都是细节的题呀,真的考验基础算法的应用和细节

两种做法

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
using namespace std;
int a[20];
int get(int x){
	if(x==0){
		cout<<"0";
		return 0;
	}
	if(x==2){
		cout<<"2";
		return 0;
}
	while(1){
	int i;
	for(i=17;a[i]>x;i--) ;//寻找小于x的第一个下标i
	if(a[i]!=2) {
		cout<<"2(";
		get(i);
		cout<<")";
	}
	else cout<<"2";
	if(x-a[i]) {
		cout<<"+";
		x=x-a[i];//上面的处理完了后进行这一步,因为有while 
	}
	else return 0;
}
}
//这个为另外一种做法:递归 
void calculate(int n,int step)
{
    if(n==0)
        return;
    calculate(n/2,step+1);
    if(n%2)
    {
        if(n/2)
            cout<<"+";
        if(step==1)
            cout<<"2";
        else
        {
            cout<<"2(";
            if(step==0)
                cout<<"0";
            else
                calculate(step,0);
            cout<<")";
        }
    }
}

int main(){
	a[0]=1;
	for(int i=1;i<=20;i++) a[i]=a[i-1]*2;
	int n;
	cin>>n;
	get(n);
return 0;
}

  

 

 posted on 2020-04-19 21:43  shirlybabyyy  阅读(361)  评论(0编辑  收藏  举报