noip第15課作業


1. 累加求和

給定n(1<=n<=100),用遞歸的方法計算1+2+3+4+5+......+(n-1)+n.

輸入:一個大於等於1的整數。

輸出:輸出一個整數。

【樣例輸入】

5

【樣例輸出】

15

#include <iostream>

using namespace std;
int fac(int n){
    if(n == 1)
        return 1;
    return (fac(n-1) + n);    
}
int main(){
    int n;
    cin >> n;
    cout << fac(n) << endl;
    return 0;
}

2. 蘋果划分問題

給定帶有編號的n個蘋果(a1,a2,...,an)放入k個(0<k<=n<30)無標號的盒子中,使得沒有一個盒子為空,請問一共有多少中划分的方法。

輸入:一行,兩個數空格隔開,第一個是蘋果數量,第二個事盒子數量。

輸出:一行包含一個數,表示一共有的划分數量。

【輸入樣例】

10 6

【輸出樣例】

22827

#include <iostream>

using namespace std;
int s(int n,int k){     //配合大數使用。防止數據爆掉 
    if(n < k || k == 0)
        return 0;
    if(k == 1 || k == n)
        return 1;
        //n = 3  k = 2 
        //n = 2  k  =1    方法只有1種 
        //  2  2     方法是1 *2  2   1 + 2  = 3 
    return s(n-1,k-1)+k*s(n-1,k);
    
}
int main(){
    //n是蘋果數量  k是盒子數量   n=3  k=2 
    int n,k;
    cin >> n >> k;
    cout << s(n,k);
    return 0;
}

1. Pell數列

Pell數列A1,A2,A3,...的定義是這樣的,A1=1,A2=2, ... ,An=2*An-1+An-2(n>2)

給出一個正整數k,要求Pell數列的第k項模上32767是多少。

輸入:第一行時測試數據的組數n,后面跟着n行輸入。每組測試數據占1行,包括一個正整數k(1<=k<=1000000).

輸出:n行,每行輸出對應一個輸入。輸出應是一個非負整數。

【樣例輸入】

2

1

8

【樣例輸出】

1

408

#include<cstdio>  
#include<cmath>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
using namespace std;  
long long b[1000010];  
long long r[1000010]; 
long long zjf(int n){  
    if(n<3)               //設置邊界  
        return n;  
    if(b[n]==0)                 //記憶化遞歸調用  
        b[n]=(2*zjf(n-1)+zjf(n-2))%100000;  //取mod,不讓long long數組爆掉,但是為了避免統計錯誤,就取100000的mod  
    return (b[n]%32767);  
}  
int main()  
{  
    int n,x;  
    cin>>n;  
    for(int i=1;i<=n;i++){  
        cin>>x;  
        //cout<<zjf(x)<<endl;
        r[i] = zjf(x);  
    }  
    for(int j=1;j<=n;j++){
        cout << r[j] << endl;
    }
} 

2.  拆分自然數

任何一個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。拆分成的數字相同但順序不同被看做是相同的方案,如3+1和1+3被看做是同一種方案。

輸入:輸入待拆分的自然數n。

輸出:如樣例輸出若干個拆分方案(具體見樣例)。

【樣例輸入】

7

【樣例輸出】

1+1+1+1+1+1+1

1+1+1+1+1+2

1+1+1+1+3

1+1+1+2+2

1+1+1+4

1+1+2+3

1+1+5

1+2+2+2

1+2+4

1+3+3

1+6

2+2+3

2+5

3+4

#include<bits/stdc++.h>  
using namespace std;  
int a[10000];  
int print(int n)  
{  
    for(int i=1; i<=n; i++)  
    {  
        if(i!=1)  
            printf("+");  
        printf("%d",a[i]);  
    }  
    printf("\n");  
}  
int DFS(int n,int ans)  //ans表示遞歸的深度,每一個深度對應 多個表達式,  
{  
    for(int i=1; i<=n/2; i++)   //后者大於等於前者  
    {  
        if(i>=a[ans-1])        //保證后一個值一定大於等於前一個值  
        {  
            a[ans]=i;  
            a[ans+1]=n-i;  
            print(ans+1);  
            DFS(n-i,ans+1);   
        }  
    }  
} 
int main()  
{  
    int n;  
    while(~scanf("%d",&n))  
    {  
        a[0]=0;  
        DFS(n,1);  
    }  
}  

3. 分數求和

輸入n個分數並對他們求和,並用最簡單形式表示。所謂的最簡單形式是指:分母分子的最大公約數是1;若最終結果的分母為1,則直接用整數表示。

如:5/6, 10/3均是最簡形式,而3/6需要化簡為1/2, 3/1需要化簡為3。

分子分母均不為0,也不為負數。

輸入:第一行是一個整數n,表示分數個數,1<=n<=10;接下來的n行,每行一個分數,用”p/q”的形式表示,不含空格,p,q均不超過10。

輸出:只有一行,即最終結果的最簡形式。若為分數,用”p/q”表示。

【樣例輸入】

2

1/2

1/3

【樣例輸出】

5/6

#include<iostream>  
#include<cstdlib>  
#include<algorithm>  
#include<iomanip>  
#include<math.h>  
#include<cstdio>  
using namespace std;  
int gcd(int a,int b)//最大公約數   
{  
    if(b==0) return a;  
    return gcd(b,a%b);  
}  
int lcd(int a,int b)//最小公倍數   
{  
    int c;  
    if(a<=0||b<=0) return -1;  
    c=gcd(a,b);   
    return a*b/c;  
}  
int main()  
{     
    int n,d,num1=0,num2=1,num3=0,num4=1;  
    cin>>n;  
    char c;  
    while(n--)  
    {  
        scanf("%d%c%d",&num1,&c,&num2);  
        d=lcd(num2,num4);  
        num3=num3*d/num4+num1*d/num2;  
        num4 =d;  
        d=gcd(num3,num4);  
        if(d>1)  
        {  
            num3/=d;  
            num4/=d;  
        }  
    }  
    num4>1?printf("%d/%d",num3,num4):printf("%d",num3);  
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM