暴力 / 高精度 / 递归分治



三连击

题目描述

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数。

输入输出格式

输入格式:

 

木有输入

 

输出格式:

 

若干行,每行3个数字。按照每行第一个数字升序排列。

 

输入输出样例



输入样例#1:


输出样例#1:

192 384 576
* * *
...
* * *
(输出被和谐了)


 三重循环暴力枚举数字即可。

其实也可以枚举第一个数字,按照比例算其他两个数字。


[NOIP1998] 普及组_递归[NOIP1998] 普及组_输入输出_02


1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 bool bo;
6 int main(){
7 int a[10]={0};
8 int i,j,k=0;
9 bool bo;bo=true;
10 for(i=123;i<=333;i++){
11 a[1]=i/100;
12 a[2]=i/10%10;
13 a[3]=i%10;
14 a[4]=i*2/100;
15 a[5]=i*2/10%10;
16 a[6]=i*2%10;
17 a[7]=i*3/100;
18 a[8]=i*3/10%10;
19 a[9]=i*3%10;
20 bo=true;
21 for(j=1;j<=8;j++)
22 for(k=j+1;k<=9;k++)
23 if(a[j]==a[k]||a[j]==0||a[k]==0) bo=false;
24 if(bo==true){
25 cout<<a[1]<<a[2]<<a[3]<<" "<<a[4]<<a[5]<<a[6]<<" "<<a[7]<<a[8]<<a[9]<<endl;
26 }
27 //for(j=1;j<=9;j++) cout<<a[j]; //test
28
29
30 }
31 return 0;
32 }

三连击

 

 

阶乘之和

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)

其中“!”表示阶乘,例如:5!=5*4*3*2*1。

输入输出格式

输入格式:

 

一个正整数N。

 

输出格式:

 

一个正整数S,表示计算结果。

 

输入输出样例



输入样例#1:

3


输出样例#1:

9


 裸高精乘


[NOIP1998] 普及组_#include_03[NOIP1998] 普及组_递归_04


1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int a[1000]={0};
5 int b[1000]={0};
6 int N=0;
7 int la=1,lb=1;
8 void plu(int a[],int b[]){
9 for(int i=1;i<=la||i<=lb;i++){
10 a[i]+=b[i];
11 if(a[i]>5&&a[i+1]==0) la++;
12 a[i+1]+=a[i]/10;
13 a[i]%=10;
14 }
15 }
16 void muti(int n){
17 if(n>N) return;
18 int i;
19 for(i=1;i<=lb;i++)
20 b[i]*=n;
21 for(i=1;i<=lb;i++){
22 if(b[i]>=10){
23 if(b[i+1]==0) lb++;
24 b[i+1]+=b[i]/10;
25 b[i]%=10;
26 }
27 }
28 plu(a,b);
29 muti(n+1);
30 }
31 int main(){
32 int n=0;
33 cin>>N;
34 b[1]=1;
35 muti(1);
36 while(a[la]==0&&la>1)la--;
37 for(int j=la;j>=1;j--) printf("%d",a[j]);
38 return 0;
39 }

阶乘之和

 

幂次方

题目太长不放

递归处理


[NOIP1998] 普及组_#include_05[NOIP1998] 普及组_#include_06


1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<cstring>
5 #include<algorithm>
6 using namespace std;
7
8 int a[30];
9 int dfs(int n)
10 {
11 //幂为0、1、2则直接输出,>=3则递归求解。
12 int i=0;
13 if(n!=0)
14 {
15 while(n>=a[i]) i++; i--; //找到最大的幂
16 n-=a[i];//下面12~20行是处理减去的这部分。
17 printf("2");
18 if(i!=1)printf("(");//注意1次幂是2而不是2(1)
19 if( i==0 || i == 2 ) printf("%d)",i);//幂为0、1、2时可输出幂(幂1时无输出)
20 //如果幂>=3,对幂递归,不输出幂。
21 if(i>=3) {dfs(i);printf(")");}//递归求解,再添加右括号。
22 if(n!=0) {printf("+");dfs(n);}//子问题与子问题之间用+连接;处理剩余的n(子问题)。
23 }
24 return 0;
25 }
26 int main(void)
27 {
28 int i,n;
29 a[0]=1;
30 for(i=1;i<50;i++)
31 a[i]=a[i-1]*2; //a:1 2 4 8 16 32……
32 scanf("%d",&n);
33 dfs(n);
34 return 0;
35 }

幂次方