[NOIP1998] 普及组

三连击

题目描述

将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 }  
幂次方

 

posted @ 2016-10-11 16:39  SilverNebula  阅读(598)  评论(0编辑  收藏  举报
AmazingCounters.com