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; }