遞歸水題(一年前寫的)

洛谷 P1010 冪次方

#include <bits/stdc++.h>
using namespace std;
int n,k,i,a[31];
void excel()
{
    a[0]=1;
    for(i=1;i<=30;i++)
    a[i]=a[i-1]*2;
}
void f(int n)
{
    while(n)
    {
        for(i=0;i<=30;i++)
        if(a[i]>n){k=i-1;break;}//k表示2的冪次
        n=n-a[k];//n被減到0時結束
        if(k==0&&n>0)printf("2(0)+");//n>0說明不是末尾,則後面還有一個+號
        if(k==0&&n==0)printf("2(0)");//n=0說明是末尾了,沒有+號
        if(k==1&&n>0)printf("2+");
        if(k==1&&n==0)printf("2");
        if(k==2&&n>0)printf("2(2)+");
        if(k==2&&n==0)printf("2(2)");
        if(k>2)
        {
            printf("2(");
            f(k);//對括號裏面的數也就是2的冪次進行分解
            if(n>0)printf(")+");//分解到了末尾,有+號
            else printf(")");//否則沒+號
        }
    }
}
int main()
{
    excel();cin>>n;f(n);
    return 0;
}

nefu 1759 數字分段-遞歸

不用遞歸也可。

#include <bits/stdc++.h>
using namespace std;
int n,k,i,sum,cnt1,cnt2,a[101],ans1[101],ans2[101];
int main()
{
    cin>>n>>k;
    for(i=1;i<=n;i++)
        cin>>a[i];
    cnt1=cnt2=sum=0;
    ans2[++cnt2]=n;//ans2記錄右端點,逆序搜索,第一個右端點爲n
    for(i=n;i>=1;i--)//逆序遍歷
    {
        sum=sum+a[i];
        if(sum>k)
        {sum=a[i];ans1[++cnt1]=i+1;ans2[++cnt2]=i;}
    }
    ans1[++cnt1]=1;//ans1記錄左端點,逆序搜索,最後一個左端點爲1
    for(i=cnt1;i>=1;i--)//因爲是逆序搜索左右端點,所以要逆序輸出答案
    printf("%d %d\n",ans1[i],ans2[i]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章