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
浙公网安备 33010602011771号