为了能到远方,脚下的每一步都不能少.|

Zac-saodiseng

园龄:2年4个月粉丝:3关注:0

ACM预备队-week1(模拟与高精度)

1.乒乓球

原题链接:P1042 [NOIP2003 普及组] 乒乓球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

看到这样一道如此...有难度的题目,(Or2)DALAO们写的都好复杂(膜!)

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int fst1[6000],fst2[6000],sed1[6000],sed2[6000];//fst代表11分制,当局赢的小比分,sed代表21分制,当局赢的小比分
 4 int fst_cnt=1;int sed_cnt=1;//代表fst和sed各自的轮数
 5 int main()
 6 {
 7     char s;
 8     while(cin>> s && s!='E')
 9     {
10         if(s=='W')
11         {
12             fst1[fst_cnt]++;
13             sed1[sed_cnt]++;
14         }
15         if(s=='L')
16         {
17             fst2[fst_cnt]++;
18             sed2[sed_cnt]++;
19         }
20         //更新轮数,注意不能if , else if
21         if((fst1[fst_cnt]>=11||fst2[fst_cnt]>=11) && (abs(fst1[fst_cnt]-fst2[fst_cnt])>=2))
22             fst_cnt++;
23         if((sed1[sed_cnt]>=21||sed2[sed_cnt]>=21)&& (abs(sed1[sed_cnt]-sed2[sed_cnt])>=2))
24             sed_cnt++;
25     }
26     for(int i=1;i<=fst_cnt;i++)cout<<fst1[i]<<":"<<fst2[i]<<endl;
27     cout<<endl;
28     for(int i=1;i<=sed_cnt;i++)cout<<sed1[i]<<":"<<sed2[i]<<endl;
29     return 0;
30 }
复制代码

 

 

2.高精度模拟加法

 

原题链接:题目详情 - 7-2 高精度加法 (pintia.cn)

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 vector<int> add(vector<int>&A,vector<int>&B)
 4 {
 5     if(A.size()<B.size())return add(B,A);//时刻保证长的加短的(我定的规则doge)
 6     vector<int> C;
 7     int t=0;
 8     for(int i=0;i<A.size();i++)
 9     {
10         t+=A[i];
11         if(i<B.size())t+=B[i];
12         C.push_back(t%10);
13         t/=10;
14     }
15     if(t)C.push_back(t);//加法没有前导零,所以不担心~,只用注意进位就好~~
16     return C;
17 }
18 int main()
19 {
20     string a,b;//习惯用字符串读取超过16位的整数
21     cin>>a>>b;
22     vector<int>A,B;
23     for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//!!!!此处的-'0'一定不能忘,要不无法转化为数字存入容器!!!!
24     for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
25     auto C=add(A,B);
26     for(int i=C.size()-1;i>=0;i--)cout<<C[i];
27 }
复制代码

 

 

3.高精度求累加和

原题链接:题目详情 - 7-3 高精度求累加和 (pintia.cn)

吐槽:起初傻傻的想能不能循环 肯定TLE!!QwQ 

各种高精度能遇到的情况:

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 vector<int> add(vector<int>&A,vector<int>&B)
 4 {
 5     if(A.size()<B.size())return(B,A);
 6     vector<int>C;
 7     int t=0;
 8     for(int i=0;i<A.size();i++)
 9     {
10         t+=A[i];
11         if(i<B.size())t+=B[i];
12         C.push_back(t%10);
13         t/=10;
14     }
15     if(t)C.push_back(t);
16     return C;
17 }
18 vector<int> muldi(vector<int>&A,int b)//高精度*低精度
19 {
20     vector<int>C;
21     int t=0;
22     for(int i=0;i<A.size();i++)
23     {
24         t+=A[i]*b;
25         C.push_back(t%10);
26         t/=10;
27     }
28     if(t)C.push_back(t);
29     return C;
30 }
31 vector<int> mulgao(vector<int>&A,vector<int>&B)//高精度*高精度
32 {
33     vector<int>C(A.size()+B.size(),0);//两数相乘的位数一定小于等于两数各自的位数和
34     for(int i=0;i<A.size();i++)
35         for(int j=0;j<B.size();j++)
36             C[i+j]+=A[i]*B[j];//加等于!!!
37     int t=0;
38     for(int i=0;i<C.size();i++)
39     {
40         t+=C[i];
41         C[i]=t%10;
42         t/=10;
43     }
44     while(C.back()==0&&C.size()>1)C.pop_back();
45     return C;
46 }
47 vector<int> div(vector<int>&A,int b,int &r)//引用传参,b不能引用传参
48 {
49     vector<int>C;
50     r=0;
51     for(int i=A.size()-1;i>=0;i--)//和加法减法乘法都不相同,除法是倒着来的
52     {
53         r=r*10+A[i];
54         C.push_back(r/b);
55         r%=b;
56     }
57     reverse(C.begin(),C.end());
58     while(C.size()>1&&C.back()==0)C.pop_back();
59     return C;
60 }
61 int main()
62 {
63     string n;
64     cin>>n;
65     int r=0;//若要求余数,则就是r
66     vector<int> A,B;
67     for(int i=n.size()-1;i>=0;i--)A.push_back(n[i]-'0');
68     B.push_back(1);
69     auto D=add(A,B);
70     auto E=mulgao(D,A);
71     auto F=div(E,2,r);
72     for(int i=F.size()-1;i>=0;i--)printf("%d",F[i]);
73 }
复制代码

 

本文作者:Zac-saodiseng

本文链接:https://www.cnblogs.com/Zac-saodiseng/p/16839056.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Zac-saodiseng  阅读(1894)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起