又见高精度
来源:互联网 发布:java毫秒转换成天数 编辑:程序博客网 时间:2024/05/04 10:12
具体模板我前面的博文中有:大数类模板,我一直都在用这个模板,我认为比较的好,思路较为清晰,好吧,再次复出啦。
高精度加法:具体见POJ 2413(有多少个菲波数?),意思不难理解,求区间[a,b](a<=b)中菲波数的个数。
一般思考方法,枚举,但是题目中说了a<=b<=10^100,相当于100位,枚举肯定超时,可以换种思路,菲波数是Fib[n]=Fib[n-1]+Fib[n-2],相当于每次都在成倍数增长,所以可以枚举菲波数,如果在这个区间的话,在枚举下个菲波数,由于菲波数的值增长特性,应该不会超时,具体见代码,代码中addtion(s1,s2)是大数类模板中的高精度相加的模板:
#include<iostream>#include<string>#include<cstring>using namespace std;const int MAX=150;#define CLR(arr,val) memset(arr,val,sizeof(arr))int sum1[MAX],sum2[MAX];bool Comp(string s1,string s2){ int len1=s1.length(),len2=s2.length(); if(len1>len2) return true; if(len1==len2) { for(int i=0;i<len1;i++) if(s1[i]!=s2[i]) { if(s1[i]<s2[i]) return false; return true; } return true; } return false;}int main(){ string s3,s4; while(cin>>s3>>s4) { if(s3=="0"&&s4=="0") break; string s,s1="1",s2="1"; while(!Comp(s1,s3)) { s=addtion(s1,s2); s2=s1; s1=s; } int sum=0; while(!Comp(s1,s4)||s1==s4) { sum++; s=addtion(s1,s2); s2=s1; s1=s; } cout<<sum<<endl; }return 0;}
当然可以直接先存储所有的菲波数值,然后直接查找即可,具体见代码,只写出修改的位置和main:
const int MAX=500; //开始的时候取小了,直接REstring Fib[MAX];.............. int main(){ int n,Case; Fib[1]="1",Fib[2]="2"; for(int i=3;i<MAX;i++) Fib[i]=Sub(Fib[i-1],Fib[i-2]); while(cin>>s3>>s4) { if(s3=="0"&&s4=="0") break; int sum=0; for(int i=1;;i++) { if(Comp(Fib[i],s4)&&Fib[i]!=s4) break; if(Comp(Fib[i],s3)) sum++; } cout<<sum<<endl; } return 0;}
题2:NYOJ 513(A+B),这种题目应该都划分在简单题中,就是要考虑的情况太多,所以AC率也不高~,我做了好久,用的c++,Java应该很好写,下面是我的C++代码,写得比较的凌乱吧~
#include<iostream>#include<cstring>#include<string>using namespace std;const int MAX=1010;#define max(a,b) a>b?a:b#define CLR(arr,val) memset(arr,val,sizeof(arr))int Maxl,sum1[MAX],sum2[MAX];int Pos(string s){ string::size_type pos=s.find('.'); if(pos!=string::npos) return pos; //要注意第一位为小数点的情况 return -1;}int Len(string s){ if(Pos(s)!=-1) return s.length()-Pos(s)-1; return 0; }string Change(string s) //补充多余的后导0 { int len=Maxl-Len(s); for(int i=0;i<len;i++) s+='0'; return s; }string Sub(string s1,string s2) { int i,j; CLR(sum1,0); CLR(sum2,0); for(j=0,i=s1.length()-1;i>=0;i--) if(s1[i]!='.') sum1[j++]=(int)s1[i]-'0'; for(j=0,i=s2.length()-1;i>=0;i--) if(s2[i]!='.') sum2[j++]=(int)s2[i]-'0'; for(i=0;i<MAX;i++) { sum1[i]+=sum2[i]; if(sum1[i]>=10) { sum1[i]-=10; sum1[i+1]++; } } string s=""; for(i=MAX-1;i>=0;i--) s+=(char)sum1[i]+'0'; return s; } int main(){ string s1,s2; while(cin>>s1>>s2) { int i,len1=Pos(s1),len2=Pos(s2); Maxl=max(Len(s1),Len(s2)); //求出最大小数点后面的位数 s1=Change(s1),s2=Change(s2); string s=Sub(s1,s2); string::iterator it=s.begin(); if(len1!=-1||len2!=-1) s.insert(it+s.length()-Maxl,'.'); //插入小数点 if(s.find('.')!=string::npos) //全是整数的话不能删除后导0 for(i=s.length()-1;i>=0&&s[i]=='0';i--) s.erase(it+i); for(i=0;i<s.length()-1&&s[i]=='0'&&s[i+1]!='.';i++); if(i<s.length()) { for(;i<s.length()-1;i++) cout<<s[i]; if(s[s.length()-1]!='.') cout<<s[s.length()-1]; } else cout<<0; cout<<endl; } return 0;}
题3:NYOJ 524(A-B),就是判断A=B,特别注意的是符号不同时两个数都为0的情况,我是把那个NO写成了No,WA了n次,下面为我凌乱的代码,呵呵~~
#include<iostream>#include<cstring>#include<string>using namespace std;const int MAX=210;#define max(a,b) a>b?a:b#define CLR(arr,val) memset(arr,val,sizeof(arr))int Maxl,sum1[MAX],sum2[MAX];bool Judge(string s1,string s2){ if(s1[0]=='-'&&s2[0]!='-') return false; if(s2[0]=='-'&&s1[0]!='-') return false; return true; }int Pos(string s){ string::size_type pos=s.find('.'); if(pos!=string::npos) return pos; return -1;}int Len(string s){ if(Pos(s)!=-1) return s.length()-Pos(s)-1; return 0;}string Change(string s){ int len=Maxl-Len(s); for(int i=0;i<len;i++) s+='0'; return s; }void Init(string s1,string s2){ CLR(sum1,0); CLR(sum2,0); for(int i=s1.length()-1,j=0;i>=0;i--) if(s1[i]!='.'&&s1[i]!='+'&&s1[i]!='-') sum1[j++]=(int)s1[i]-'0'; for(int i=s2.length()-1,j=0;i>=0;i--) if(s2[i]!='.'&&s2[i]!='+'&&s2[i]!='-') sum2[j++]=(int)s2[i]-'0'; } bool Comp1(){ int i; for(i=MAX-1;i>=0;i--) if(sum1[i]!=sum2[i]||sum1[i]!=0||sum2[i]!=0) return false; return true;} bool Comp2(){ for(int i=MAX-1;i>=0;i--) if(sum1[i]!=sum2[i]) return false; return true; }int main(){ string s1,s2; while(cin>>s1>>s2) { Maxl=max(Len(s1),Len(s2)); s1=Change(s1),s2=Change(s2); Init(s1,s2); if(Judge(s1,s2)) { if(Comp2()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } else { if(Comp1()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0;}
- 又见高精度
- 高精度
- 高精度
- 高精度
- 高精度。。
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 高精度
- 探索C++的秘密之详解extern "C"
- Oracle数据库连接
- LogCat命令详细说明
- Linux时间设置与NTP服务配置
- HTML中label标签的用途
- 又见高精度
- 利用小马下载全站程序,(php inc格式文件包括目录结构)的py代码
- VC中退出应用程序-几种很有用的方法
- Unity3D图像后处理特效——Twirl image effect
- OpenSessionInViewFilter——>TransactionSynchronizationManager
- Jquery的过滤选择器
- opencv2.3.1源码调试方法
- HTML5开发展示:辉途致信汽车展示系统APP
- 一个计算机爱好者的不完整回忆(三十三)做过的软件