|
5#
楼主 |
发表于 2021-5-16 20:10:44
|
只看该作者
加入高精度过程,这里为了统一,我采用运算符重定义的做法,用结构题BigNum表示一个数,带两个变量,一个有效长度l和一个数组a。
重新定义了几个运算符:
1、<= 这个比较简单,短的比较小长的比较大,长度相等的话就从从第一个开始比较,不同的数字就比出来了结果。
2、* 大整数相乘 这个也很简单,标准的矩阵乘法,最后处理进位和长度,一般来说n位数*m位数得到n+m或者n+m-1位。(0没有考虑)
3、+ 分两个,大+小或者大+大。这都是以前的范例程序
4、- 这里只有一个M+1和M-1。但是也标准的写一个,注意%的使用,我这里比较巧妙。有可能减很大的数字,注意。
5、/ 大除小,基本的355/113的做法 但是多了一个去前面的0的过程,这里也可以类似上面的先比较再除,
我写了十几分钟,基本没有调试,一下就AC了,因为我这些基本功很到位的,你做了多少时间呢?
附·AC代码
- #include <bits/stdc++.h>
- using namespace std;
- struct BigNum
- {
- int l;//位数
- int a[22000];
- BigNum()//初始化
- {
- memset(a,sizeof(a),0);
- l=1;
- }
- void pp() //输出
- {
- for (int i=l-1; i>=0; i--) cout<<a[i];
- cout<<' ';
- }
- } A,B,C,L,R,M,X,ANS;
- bool operator <= (BigNum A,BigNum B)// 大的比大的
- {
- if(A.l>B.l) return 0;
- if(A.l<B.l) return 1;
- for (int i=A.l-1; i>=0; i--) // 这个比较精妙
- if (A.a[i]<B.a[i]) return 1;
- else if (A.a[i]>B.a[i]) return 0;
- return 1;
- }
- BigNum operator * (BigNum A,BigNum B)// 大的乘大的
- {
- BigNum C;
- int i,j,x;
- C.l=A.l+B.l;
- for (i=0; i<=C.l-1; i++) C.a[i]=0;
- for (i=0; i<=A.l-1; i++)
- for (j=0; j<=B.l-1; j++)
- C.a[i+j]+=A.a[i]*B.a[j];
- for (i=0; i<=C.l-1; i++)
- {
- x=C.a[i];
- C.a[i]=x%10;
- C.a[i+1]+=x/10;
- }
- while (C.a[C.l-1]==0 && C.l>1) C.l--;
- return C;
- }
- BigNum operator + (BigNum A,BigNum B)// 大的加大的
- {
- if (A.l<B.l) swap(A,B);
- int x,i;
- for (i=0; i<=B.l-1; i++) A.a[i]+=B.a[i];
- for (i=0; i<=A.l-1; i++)
- {
- x=A.a[i];
- A.a[i]=x%10;
- A.a[i+1]+=x/10;
- }
- if (A.a[A.l]>0)A.l++;
- return A;
- }
- BigNum operator + (BigNum A,int b)
- {
- int x,i;
- A.a[0]+=b;
- for (i=0; i<=A.l-1; i++)
- {
- x=A.a[i];
- A.a[i]=x%10;
- A.a[i+1]+=x/10;
- }
- if (A.a[A.l]>0) A.l++;
- return A;
- }
- BigNum operator - (BigNum A,int b)
- {
- int x,i;
- A.a[0]-=b;
- for (i=0; i<=A.l-1; i++)
- {
- x=A.a[i];
- if (x<0) //这个我觉得写的很好
- {
- A.a[i]=x%10+10;
- A.a[i+1]+=(x/10-1);
- }
- }
- while (A.a[A.l-1]==0 && A.l>0) A.l--;
- return A;
- }
- BigNum operator / (BigNum A,int b)
- {
- int i,x=0;
- for (i=A.l-1; i>=0; i--)
- {
- x=10*x+A.a[i];
- A.a[i]=x/b;
- x=x%b;
- }
- while (A.a[A.l-1]==0 && A.l>0) A.l--;
- return A;
- }
- BigNum Ch(string s)
- {
- int l=s.size();
- BigNum A;
- A.l=l;
- for (int i=0; i<=l; i++) A.a[i]=s[l-1-i]-'0';
- return A;
- }
- int main()
- {
- string sa,sb;
- cin>>sa>>sb;
- A=Ch(sa),B=Ch(sb);
- L=Ch("0"),R=Ch("99999999999");
- while (L<=R)
- {
- M=(R+L)/2;
- X=M*B;
- //L.pp(),R.pp(),M.pp(),X.pp();
- //cout<<endl;
- if (X<=A)
- {
- ANS=M;
- L=M+1;
- }
- else R=M-1;
- }
- ANS.pp();
- return 0;
- }
复制代码 |
|