暴力 / 高精度 / 递归分治
三连击
题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数。
输入输出格式
输入格式:
木有输入
输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。
输入输出样例
输入样例#1:
输出样例#1:
192 384 576
* * *
...
* * *
(输出被和谐了)
三重循环暴力枚举数字即可。
其实也可以枚举第一个数字,按照比例算其他两个数字。
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
裸高精乘
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 }
阶乘之和
幂次方
题目太长不放
递归处理
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 }
幂次方