void Solve()
{
cin>>n;
map<int,int>mp;
for(int i=0;i<n;++i)
{
string m;
cin>>m;
int t=mod(m);
mp[t]++;
}
cout<<mp[0]/2+min(mp[1],mp[2])<<endl;
}
模拟mod3,找出能mod3的幸运数字,cout<<mp[0]/2+min(mp[1],mp[2])<<endl;就可以了
给兄弟上四道水题模拟(模拟加减乘除);
这里把所有的数据域扩大
下面给兄弟们AC代码,这个可以作为模板!!!
1.模拟加法:
//模拟加法
#include<bits/stdc++.h>
using namespace std;
void Solve (){
string n,m,str;
cin>>n>>m;
int t=0;
int len1=n.length(),len2=m.length();
for(int i=len1-1,j=len2-1;i>=0||j>=0||t>0;--j,--i){
if(i>=0)t+=n[i]-'0';
if(j>=0)t+=m[j]-'0';
str+=((t%10)+'0');
t/=10;
}
reverse(str.begin(),str.end());
cout<<str<<endl;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Solve();
}
2.模拟减法:
Frist:用vector模拟,存入数字,之后输出数字;
#include <iostream>
#include <vector>
using namespace std;
const int N=1000010;
bool cmp(vector<int>&A,vector<int>&B)//判断A是否比B大
{
if (A.size()!=B.size()) return A.size()>B.size();//基础长度比较
for (int i=A.size()-1;i>=0;i--)
if (A[i]!=B[i])
return A[i]>B[i]; //每个数为值比较
return true;
}
vector<int>sub(vector<int>&A,vector<int>&B)
{
vector<int>C;//保存答案
int t=0;
for(int i=0;i<A.size();i++)
{
t=A[i]-t;//减去借位
if (i<B.size())t-=B[i];
C.push_back((t+10)%10);//加上借位
if(t<0)t=1;
else t=0;
}
//去前导零
//while (C.back()==0&&C.size()>1)C.pop_back();
for(int i=C.size()-1;i>=0;i--)
if(C.back()!=0)break;
else if(!C.back())C.pop_back();
if(C.size()==0)C.push_back(0);
return C;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int>A,B,C;
for (int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');//要从低位减起
for (int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
if (cmp(A,B))C=sub(A,B);
else {
C = sub(B, A);
cout<<'-';
}//若B比A大,将A-B变为B-A,加上负号
for (int i=C.size()-1;i>=0;i--) cout<<C[i];//倒序输出
return 0;
}
Second:用string直接模拟 cout<<str;
#include<bits/stdc++.h>
using namespace std;
bool cmp(string &a,string &b){
if(a.size()!=b.size())return a.size()>b.size();
for(int i=0;i<a.size();++i){
if(a[i]!=b[i])return a[i]>b[i];
}
return true;
}
string sub(string &a,string &b){
string str;
int t=0;
int len1=a.length(),len2=b.length();
for(int i=len1-1,j=len2-1;i>=0||j>=0;--j,--i){
if(i>=0)t+=a[i]-'0';
if(j>=0)t-=b[j]-'0';
if(t<0)str+=((t+10)%10)+'0',t=-1;
else str+=t+'0',t=0;
}
int len=str.size();
for(int i=len-1;i>=0;--i){
if(str[i]=='0')str.pop_back();
else break;
}
if(str.empty())str+='0';
reverse(str.begin(),str.end());
return str;
}
void Solve (){
string n,m,str;
cin>>n>>m;
int t=0,flag=1;
int len1=n.length(),len2=m.length();
if(cmp(n,m))str=sub(n,m);
else str='-'+sub(m,n);
cout<<str;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Solve();
}
3.模拟乘法
高精度*高精度
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include <vector>
#include<string>
#include<cstring>
#include<numeric>
#include<queue>
#include <bits/stdc++.h>
#define endl '\n'
#define inf 0x3f3f3f3f
#define inf_max 0x7f7f7f7f
typedef long long ll;
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> &a,vector<int> &b){
vector<int>c(a.size()+b.size()+100,0);
int t=0,len1=a.size(),len2=b.size();
for(int i=0;i<len1;++i){
for(int j=0;j<len2;++j){
c[i+j]+=a[i]*b[j];
}
}
int len3=c.size();
for(int i=0;i<len3;++i){
t+=c[i];
c[i]=t%10;
t/=10;
}
while(c.back()==0&&c.size()>1)c.pop_back();
//reverse(c.begin(),c.end());
return c;
}
void Solve (){
string a,b;
cin>>a>>b;
vector<int>arr,brr;
int len1=a.size(),len2=b.size();
for(int i=len1-1;i>=0;--i)arr.push_back(a[i]-'0');
for(int i=len2-1;i>=0;--i)brr.push_back(b[i]-'0');
auto c=mul(arr,brr);
for(auto i:c)cout<<i;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Solve();
}
更新:大数相加A+B和大数相乘A*B通用模板
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> add(vector<int> A, vector<int> B) {
// A: 4 3 2 1
// B: 6 5
vector<int> C(max(A.size(), B.size()) + 7, 0); // 数组C开大一点没事,反正可以去前导零的
for (int i = 0; i < A.size(); i ++) C[i] += A[i];
for (int i = 0; i < B.size(); i ++) C[i] += B[i];
// 处理进位
for (int i = 0; i + 1 < C.size(); i ++) {
C[i + 1] += C[i] / 10;
C[i] %= 10;
}
// 处理前导零
while (C.size() > 1 && C.back() == 0) C.pop_back();
reverse(C.begin(), C.end());
return C;
}
vector<int> mul(vector<int> A, vector<int> B) {
// A: 4 3 2 1
// B: 6 5
vector<int> C(A.size() + B.size() + 7, 0); // 数组C开大一点没事,反正可以去前导零的
for (int i = 0; i < A.size(); i ++) {
for (int j = 0; j < B.size(); j ++) {
C[i + j] += A[i] * B[j];
}
}
// 处理进位
for (int i = 0; i + 1 < C.size(); i ++) {
C[i + 1] += C[i] / 10;
C[i] %= 10;
}
// 处理前导零 "0000" 去掉前导零
while (C.size() > 1 && C.back() == 0) C.pop_back();
reverse(C.begin(), C.end());
return C;
}
int main() {
string s1 = "9899", s2 = "100";
vector<int> A, B;
for (int i = s1.size() - 1; i >= 0; i --) A.push_back(s1[i] - '0');
for (int i = s2.size() - 1; i >= 0; i --) B.push_back(s2[i] - '0');
vector<int> C = add(A, B);
cout << s1 << "+" << s2 << "=";
for (int i = 0; i < C.size(); i ++) cout << C[i];
cout << endl;
C = mul(A, B);
cout << s1 << "*" << s2 << "=";
for (int i = 0; i < C.size(); i ++) cout << C[i];
cout << endl;
return 0;
}
4.模拟除法
#include<bits/stdc++.h>
using namespace std;
vector<int> div(vector<int>& a,int b,int &t){
int len1=a.size();
vector<int>c;
for(int i=0;i<len1;++i){
t=t*10+a[i];
c.push_back(t/b);
t=t%b;
}
reverse(c.begin(),c.end());
while(c.back()==0&&c.size()>1)c.pop_back();
reverse(c.begin(),c.end());
return c;
}
void Solve (){
string a;int b,t=0;
cin>>a>>b;
vector<int>arr;
int len=a.size();
for(int i=0;i<len;++i)arr.push_back(a[i]-'0');
auto c=div(arr,b,t);
for(auto i:c)cout<<i;
cout<<endl<<t;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Solve();
}