小米oj 判斷是否為連乘數字串
阿新 • • 發佈:2018-12-20
判斷是否為連乘數字串
序號:#32難度:非常難時間限制:1000ms記憶體限制:10M
描述
給出一個字串S,判斷S是否為連乘字串。 連乘字串定義為: 字串拆分成若干數字,後面的數字(從第三個數字開始)為前面2個數字的乘積。 例如: 122,可以拆成{1|2|2},有12=2 1122242,可以拆成{11|22|242},有1122=242 1224832256,可以拆成{1|2|2|4|8|32|256},有12=2,22=4,24=8,48=32,8*32=256。
若是連乘字串,則輸出true,否則輸出false。(PS:不考慮乘以0)
輸入
一個正整數字符串
輸出
字串true或者false,表示是否可以拆成連乘數字。
輸入樣例
122 113 1122242
複製樣例
輸出樣例
true false true
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef long long ll; ll num(int l,int r,string s) { ll res=0; int len=r-l+1; ll tmp=1; for(int i=r;i>=l;i--) { res+=(s[i]-'0')*tmp; tmp*=10; } return res; } bool ok2(ll a,ll b,string s) { ll next=a*b; string tmp=std::to_string(next); if(s.size()<tmp.size())return false; if(s.size()==tmp.size()) { return s==tmp; } if(s.size()>tmp.size()) { int len=tmp.size(); for(int i=0;i<len;i++)if(s[i]!=tmp[i])return false; string sub_s=""; for(int i=len;i<s.size();i++)sub_s+=s[i]; return ok2(b,next,sub_s); } } bool ok(string s) { int len=s.size(); bool f=0; for(int i=0;i<len;i++) { for(int j=i+1;j<len;j++) { ll a=num(0,i,s); ll b=num(i+1,j,s); string sub_s=""; for(int t=j+1;t<len;t++)sub_s+=s[t]; if(ok2(a,b,sub_s)){f=1;break;} } if(f)break; } return f; } bool judge(string s) { return ok(s); } int main() { // freopen("in.txt","r",stdin); string ss; while(cin>>ss) { cout<<(judge(ss)?"true":"false")<<endl; } return 0; }