您的位置:首页 > 其它

上海交通大学2016年6月CS保研机试题

2016-06-30 18:04 375 查看
题2:addictive string

判断一个字符串是否是加和字串。

如12358,10099199都是加和字串。

它们可看做1,2,3,5,8:1+2=3;2+3=5;3+5=8

输入:

输入的数可能很大,注意要处理很大的数。

每一个数不以0开头。

如12358

输出:

若这个输入不是加和字串,输出

0

Not Found

若是加和字串,输出

1

1+2=3;2+3=5;3+5=8

解法:遍历获得前两个数,再利用斐波那契数列求得一个与输入长度相当的字串,判断这两个字符串是否是一样的。

先实现数字字符串的相加方法:"123"+"213"="336"

再实现基于每组的前两个数,生成结果字串的方法。如利用1,2,生成长度为5的结果字串12358

代码:
#include <iostream>
#include <string>
using namespace std;
string add(string str1,string str2){
int len1,len2;
int i=0;
int jinwei=0;
string re,strr1,strr2;
if (str1.length()>=str2.length()){
len1=str1.length();
len2=str2.length();
strr1=str1;
strr2=str2;
re=str1;
}
else {
len1=str2.length();
len2=str1.length();
strr1=str2;
strr2=str1;
re=str2;
}
int temp=0;
//cout<<"in fun re:"<<re<<endl;
for (i=len1-1;i>=0;i--){
//cout<<"i:"<<i<<endl;
if (i<len1-len2&&jinwei==0){re[i]=strr1[i];continue;}
if (i<len1-len2&&jinwei==1){re[i]=strr1[i]+1;jinwei=0;continue;}
temp=strr1[i]-'0'+strr2[i-len1+len2]-'0'+jinwei;
if (temp>=10) jinwei=1;
else jinwei=0;
//cout<<"temp"<<i<<":"<<temp<<endl;
re[i]=temp%10+'0';
//cout<<"i jinwei:"<<jinwei<<endl;
//cout<<re[i]<<"\t";
if (i==0 && jinwei==1){
//cout<<"kuo"<<endl;
re="1"+re;
break;
}
}
return re;

}
string resl(string *a){
int i=0;
string re;
while (a[i]!=""){
re=re+a[i];
i++;
}
return re;
}
int len(string *a){
int i=0;
while (a[i]!="")
i++;
return i;
}
void clear_(string *a){
int i=0;
while (a[i]!=""){
a[i]="";
i++;
}
}

//输入的是一个字符串,第一个数和第二个数,如112358,任何数不能以0打头
int main()
{
string str,temp;int leng;int flag=0;int Flag=0;
cin>>str;
int i,j,k;
string r[10000];
cout<<str<<endl;
//cout<<str.substr(0,2)<<endl;
for(i=1;i<=str.length()/2;i++){
if (str[i]=='0') {
//cout<<"第2个0开头";
continue;
}
//cout<<"1st for:"<<str.substr(0,i)<<endl;
leng=0;
for(j=1;j<=str.length()/2;j++){
leng=0;
clear_(r);
r[0]=str.substr(0,i);
leng+=(r[0]).length();
r[1]=str.substr(i,j);
leng+=(r[1]).length();
//cout<<"r[0]:"<<r[0]<<endl<<"r[1]:"<<r[1]<<endl;
for (k=2;leng<str.length();k++){
r[k]=add(r[k-2],r[k-1]);
//cout<<"r["<<k<<"]:"<<r[k]<<endl;
leng+=r[k].length();
//cout<<"length total:"<<leng<<" str length:"<<str.length()<<endl;
}
//cout<<"result:"<<resl(r)<<endl;
if (leng!=str.length()) continue;
else if (resl(r)==str){
flag=1;
break;
}
else continue;
}
if (flag==1) {Flag=1;break;}
}
if (Flag==1){
cout<<"1"<<endl;
 for (i=2;i<len(r);i++){
if(i==len(r)-1) <pre name="code" class="cpp">             cout<<r[i-2]<<"+"<<r[i-1]<<"="<<r[i];


cout<<r[i-2]<<"+"<<r[i-1]<<"="<<r[i]<<";";

} } else { cout<<"0"<<endl<<"Not found"; } return 0;}



我知道我这写的挺垃圾的,在当时做时也没有调试出来,希望有好的想法,如何写的块,可以相互交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: