Many Formulas(暴力+有技巧)

题目链接:http://exam.upc.edu.cn/problem.php?id=6467

题意:给你一个数字,在数字里任意加+号,问所有情况下,这个sum是多少

我本来想了一种,后来发现这个题真的有意思。

我有4种方法。

第一种:自己写的,枚举    len从1~n。出现的个数和  +号的位置有关。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[100];
int len;
ll f(int pos,int L){
    ll ret=0,ed=pos+L-1;
    for(int i=pos;i<=ed;i++){
        ret=ret*10+(s[i]-'0');
    }
    return ret;
}
int main()
{
    ll n;
    scanf("%s",s+1);
    len=strlen(s+1);
    sscanf(s+1,"%lld",&n);
    ll ans=0,tmp;
    for(int i=1;i<=len;i++){
        for(int j=1;j+i-1<=len;j++){
            int cur=len-i-1;
            if(1<j&&j<len-i+1){
                cur--;
            }
            cur=max(0,cur);
            tmp=f(j,i)*pow(2,cur);
            ans=ans+tmp;
            //printf("%d %d %lld\n",i,j,tmp);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

第二种:运用了二进制来实现,二进制的某一位&1,可以把当前位看作有‘+’号。

#include<bits/stdc++.h>
using namespace std;
char s[1000];
int main()
{
    scanf("%s",s);
    int len = strlen(s);
    int m=(1<<(len-1));
    long long ans=0,t;

    for(int i=0;i<m;i++){
        t=s[0]-'0';
        for(int j=0;j<len;j++){
            if(j==len-1||i&1<<j){
                ans+=t;
                t=0;
                if(j==len-1)  break;
            }
            t*=10;
            t+=s[j+1]-'0';
        }
    }
    printf("%lld\n",ans);
    return 0;
}

第三种的确是我所想的:利用string 加一个'+'来实现。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x(string s){
    ll sum=0,tmp=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='+'){
            sum+=tmp;
            tmp=0;
        }else{
            tmp=tmp*10+s[i]-'0';
        }
    }
    return sum+tmp;
}
int main()
{
        string s;
        cin>>s;
        int len=s.size()-1,a[100]={0};
        ll sum=0;
        while(1){
            string ss;
            for(int i=0;i<len;i++){
                a[i+1]+=a[i]/2;
                a[i]%=2;
            }
            if(a[len]){
                break;
            }
            for(int i=0;i<len;i++){
                ss+=s[i];
                if(a[i]){
                    ss+="+";
                }
            }
            ss+=s[len];
            sum+=x(ss);
            a[0]++;
        }
        cout<<sum<<endl;
        return 0;
}

第四种:BFS

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=1e6+10;
string st;
long long sum;
struct point{
    string ss;
    int po;
    ll v;
};
void bfs(point pp)
{
    queue<point>q;
    q.push(pp);
    while (!q.empty())
    {
        point p=q.front();
        q.pop();
        string sss=p.ss;
        int po=p.po;
        if (po==st.length()-1)
        {
            sum+=p.v;
            continue;
        }
        long long v=0;
        point pt;
        for (int i=1;po+i<st.length();i++)
        {
            v=0;
            string sy=st.substr(po+1,i);
            for (int j=0;j<sy.length();j++)
                v=v*10+(sy[j]-'0');
             //cout<<v<<"%%%%%%%%%%%%%%%%%%%%"<<endl;
            pt.ss=sy;
            //cout<<pt.ss<<"$$$$$"<<endl;
            pt.v=v+p.v;
            pt.po=po+i;
            q.push(pt);
        }   
    }   
}
int main()
{
    int k,po,cc=0;
    long long v=0;
    cin>>st;
    sum=0;
    for (int i=1;i<=st.length();i++)
    {
        point pp;
        pp.ss=st.substr(0,i);
        pp.po=i-1;
        v=0;
        for (int j=0;j<pp.ss.length();j++)
        {
            v=v*10+(pp.ss[j]-'0');
        }
        pp.v=v;
        //cout<<pp.v<<" "<<pp.ss<<"+++++"<<endl;
        bfs(pp);
    }
    cout<<sum<<endl;
    return 0;
} 


猜你喜欢

转载自blog.csdn.net/z_sea/article/details/80390590
今日推荐