高精度加法/减法/乘法/除法

P1601 A+B Problem(高精)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=505;
 4 int a[N],b[N],c[N];
 5 void get(string &s,int *p)
 6 {
 7     int n=s.size();
 8     for(int i=1;i<=n;i++)
 9     p[i]=s[n-i]^48;
10 }
11 int main()
12 {
13     string s1,s2;
14     cin>>s1>>s2;
15     get(s1,a);
16     get(s2,b);
17     int n1=s1.size(),n2=s2.size(),len=max(n1,n2),i;
18     for(i=1;i<=len;i++)
19     {
20         c[i]+=a[i]+b[i];//不能向a[i]进位避免最后一位进到没统计; 
21         if(c[i]>9)
22         {
23             c[i+1]++;
24             c[i]%=10;
25         }
26     }
27     if(!c[i])i--;
28     for(;i>=1;i--)
29     printf("%d",c[i]);
30     return 0;
31 }

P2142 高精度减法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e4+100;
 4 int a[N],b[N],c[N];
 5 void get(string &s,int *p)
 6 {
 7     int n=s.size();
 8     for(int i=1;i<=n;i++)
 9     p[i]=s[n-i]^48;
10 }
11 int main()
12 {
13     string s1,s2;
14     cin>>s1>>s2;
15     if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2))
16     {
17         swap(s1,s2);
18         cout<<"-";
19     }
20     get(s1,a);
21     get(s2,b);
22     int n1=s1.size(),n2=s2.size(),len=max(n1,n2),i;
23     for(i=1;i<=len;i++)
24     {
25         if(a[i]<b[i])
26         {
27             a[i]+=10;
28             a[i+1]--;//减法不存在进位,所以不用怕最后一位进位; 
29         }
30         c[i]=a[i]-b[i];
31     }
32     i=len;
33     while(i>1&&!c[i])i--;
34     for(;i>=1;i--)printf("%d",c[i]);
35     return 0;
36 }

P1303 A*B Problem

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 //n*m最多n+m位最少n+m-1;
 4 /*
 5             123456 
 6                789 
 7             123456 
 8            123456
 9             ...
10       123456 加法原理n+m-1,如果最高位有进位则m+n; 
11 */ 
12 const int N=1e4+5;
13 int a[N],b[N],c[N],x; 
14 void get(string &s,int*p)
15 {
16     int n=s.size();
17     for(int i=1;i<=n;i++)
18     p[i]=s[n-i]^48;    
19 } 
20 int main()
21 {
22     string s1,s2;
23     cin>>s1>>s2;
24     get(s1,a);
25     get(s2,b);
26     int n1=s1.size(),n2=s2.size();
27     for(int i=1;i<=n1;i++)
28     {
29         x=0;
30         for(int j=1;j<=n2;j++)
31         {
32             c[i+j-1]+=a[i]*b[j]+x;//当前位数 
33             x=c[i+j-1]/10;//进位 
34             c[i+j-1]%=10;
35         }
36         c[i+n2]+=x;//进位; 
37     }
38     int i=n1+n2;
39     if(x)c[i]=x;
40     while(i>1&&!c[i])i--;
41     for(;i>=1;i--)printf("%d",c[i]);
42     return 0;
43 }

 

 

P1480 A/B Problem 

这道是高精度除低精度

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=5e3+5;
 4 long long a[N],c[N],b,x;//这题数据x要开成longlong 
 5 int main()
 6 {
 7     string s;
 8     cin>>s>>b;
 9     int n=s.size();
10     for(int i=1;i<=n;i++)
11     a[i]=s[i-1]^48;
12 
13     for(int i=1;i<=n;i++)
14     {
15         c[i]=(x*10+a[i])/b;
16         x=(x*10+a[i])%b;
17     }
18     int j=1;
19     
20     while(j<n&&!c[j])j++;
21     for(;j<=n;j++)printf("%d",c[j]);
22     return 0;
23 }

 

P1480 A/B Problem  

用高精度/高精度的方法去做, 获取商和余数方法都有

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=5e3+5;
 4 int a[N],b[N],c[N];
 5 void get(string &s,int *p)
 6 {
 7     int n=s.size();
 8     p[0]=n;
 9     for(int i=1;i<=n;i++)
10     p[i]=s[n-i]^48;
11 }
12 int compare(int num1[],int num2[])
13 {
14     if(num1[0]>num2[0])return 1;
15     if(num1[0]<num2[0])return -1;
16     if(num1[0]==num2[0])
17     {
18         for(int i=num1[0];i>=1;i--)
19         {
20             if(num1[i]>num2[i])return 1;
21             if(num1[i]<num2[i])return -1;
22         }
23     }
24     return 0;
25 }
26 void jian(int a[],int b[])
27 {
28     int flg,i;
29     flg=compare(a,b);//用减法模拟除法
30     if(flg==0){a[0]=0;return;}//如果减法过程中相等了,说明能原数组a是能整除b的,余数为0;假设有a=123b,则减的过程是100b,20b,10b 3b 2b 1b即a==b;
31     if(flg==1)
32     {
33         for(i=1;i<=a[0];i++)
34         {
35             if(a[i]<b[i])
36             {
37                 a[i]+=10;
38                 a[i+1]--;
39             }
40             a[i]-=b[i];
41         }
42         while(a[0]>0&&a[a[0]]==0)a[0]--;
43     }
44 }
45 void numcpy(int a[],int b[],int dep)//把a复制到b从dep位开始复制; 
46 {
47     for(int i=1;i<=a[0];i++)//复制数组,为移位做准备
48     b[dep+i-1]=a[i];
49     b[0]=a[0]+dep-1;
50 }
51 void work(int a[],int b[],int c[])
52 {
53     int i,tmp[N];
54     c[0]=a[0]-b[0]+1;//移位操作n-m+1因为要考虑位数相等的情况
55     for(int i=c[0];i>=1;i--)
56     {
57         memset(tmp,0,sizeof(tmp));
58         numcpy(b,tmp,i);//开始移位加快算法;
59         while(compare(a,tmp)>=0){c[i]++;jian(a,tmp);}/对每一位最多循环9次;
60     }
61     while(c[0]>0&&c[c[0]]==0)c[0]--;//处理前导0;
62 }
63 int main()
64 {
65     string s1,s2;
66     cin>>s1>>s2;
67     get(s1,a);
68     get(s2,b);
69     work(a,b,c);
70     if(c[0]==0)cout<<"0"<<endl; 
71     for(int i=c[0];i>=1;i--)
72     printf("%d",c[i]);
73     //printf("%d",a[i])余数 ,特判a[0]==0余数为0;
74     return 0;
75 }

 

posted @ 2021-12-19 21:55  matt-11  阅读(92)  评论(0)    收藏  举报