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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步