上海交通大学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
代码:
cout<<r[i-2]<<"+"<<r[i-1]<<"="<<r[i]<<";";
} } else { cout<<"0"<<endl<<"Not found"; } return 0;}
我知道我这写的挺垃圾的,在当时做时也没有调试出来,希望有好的想法,如何写的块,可以相互交流。
判断一个字符串是否是加和字串。
如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;}
我知道我这写的挺垃圾的,在当时做时也没有调试出来,希望有好的想法,如何写的块,可以相互交流。
相关文章推荐
- 如何绕过 ORA-01940: cannot drop a user that is currently connected
- java DecimalFormat
- vim easy-align插件使用
- windows 环境下部署spark运行环境 (包含遇到的问题和解决方法)
- android焦点
- mysql联表Update更新的例子
- 通过包名杀死进程的方法
- Timus 1885 Passenger Comfort
- 网页html中嵌入特殊字体-此法利于SEO
- extjs 给baseCombo 添加数据
- /AndroidRuntime(11765): android.view.InflateException: Binary XML file line #19: Error inflating cla
- Django表单
- 清理iOS工程里无用的图片,可瘦身ipa
- 解决IE6双倍边距BUG
- FIR.im发布自己的移动端APP
- Windows下Apache+Tomcat实现应用集群
- Android Volley完全解析(四),带你从源码的角度理解Volley
- NYOJ 81:炮兵阵地(状压DP)
- iOSApp提交上架store详细流程
- Java中不带package的程序和带package的程序编译