东三省 Accoders题库 多校联训 4776题库答案
①1089高精加
#include<bits/stdc++.h>
using namespace std;
char a[220],b[220];
int c[220];
int main(){
scanf("%s%s",a+1,b+1);
int n=strlen(a+1),m=strlen(b+1);
for(int i=1;i<=n;i++){
a[i]-='0';
}
for(int i=1;i<=m;i++){
b[i]-='0';
}
for(int i=1;i<=max(n,m);i++){
c[i]=a[n-i+1]+b[m-i+1];
}
for(int i=1;i<=max(n,m);i++){
if(c[i]>=10){
c[i]-=10;
c[i+1]++;
}
}
int t=max(n,m)+1;
if(!c[t])t--;
for(int i=t;i;i--){
cout<<c[i];
}
}
②1810高精减
#include<bits/stdc++.h>
using namespace std;
char a[220],b[220];
int c[220];
int main(){
scanf("%s%s",a+1,b+1);
int n=strlen(a+1),m=strlen(b+1);
for(int i=1;i<=n;i++){
a[i]-='0';
}
for(int i=1;i<=m;i++){
b[i]-='0';
}
for(int i=1;i<=n;i++){
c[i]=a[n-i+1]-b[m-i+1];
}
for(int i=1;i<=max(n,m);i++){
if(c[i]<0){
c[i]+=10;
c[i+1]--;
}
}
int t=n;
while(!c[t])t--;
for(int i=t;i;i--){
cout<<c[i];
}
}
③1811 2的n次方
#include <iostream>
#include <cstring>
using namespace std;
void timesTwo(char ans[]){
int len=strlen(ans);
int tmp[1005]={0};
int sum[1005]={0};
for(int i=0;i<len;i++){
tmp[i]=ans[len-1-i]-'0';
}
for(int i=0;i<len;i++){
sum[i]+=tmp[i]*2;
sum[i+1]+=(sum[i]/10);
sum[i]%=10;
}
bool flag=false;
for(int i=len,j=0;i>=0;i--){
if(sum[i]!=0||i==0){
flag=true;
}
if(flag){
ans[j++]=sum[i]+'0';
}
}
}
int main(){
char ans[1005]={'1'};
int n;
cin>>n;
for(int i=1;i<=n;i++){
timesTwo(ans);
}
cout<<ans;
return 0;
}
④1812高精乘
#include <stdio.h>
#include <string.h>
void mul(char *a,char *b,char *c){
int len1=strlen(a),len2=strlen(b);
int x[201],y[201],z[401];
int len=len1+len2;
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
int i,j;
for (i=len1-1;i>=0;i--)
x[len1-1-i]=a[i]-'0';
for (i=len2-1;i>=0;i--)
y[len2-1-i]=b[i]-'0';
for (i=0;i<len1;i++){
for (j=0;j<len2;j++){
z[i+j]+=x[i]*y[j];
}
}
for (i=0;i<len;i++)
{
if (z[i]>=10){
z[i+1]+=z[i]/10;
z[i]=z[i]%10;
}
}
while (len>0 && z[len-1]==0)
len--;
if (len==0)
{
c[0]='0';
c[1]='\0';
return ;
}
for (i=0;i<len;i++)
c[i]=z[len-1-i]+'0';
c[len]='\0';
}
int main(){
char s1[201],s2[201],ans[401];
scanf("%s%s",s1,s2);
mul(s1,s2,ans);
printf("%s\n",ans);
return 0;
}
⑤1813高精除
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> div(vector <int> &A,int b,int &r){ // 取r的地址符,是为了更改r的值,方便后面输出余数
vector <int> C; // 答案
r = 0; // 余数
for(int i = A.size() - 1;i >= 0;i --){ // 从最高位开始处理
r = r * 10 + A[i]; // 上一次的余数乘10,再加上当前位上的数,就是被除数
C.push_back(r / b); // 往C里压入这个被除数除b
r %= b; // 计算余数
}
reverse(C.begin(),C.end()); // 因为除法运算中从高位开始计算,而前导0都在顶部而不是底部,所以要翻转过来
while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除前导0
return C; // 返回答案
}
int main(){
string a;
int b;
cin>>a>>b;
vector <int> A;
for(int i = a.size() - 1;i >= 0;i --) A.push_back(a[i] - '0'); // 倒序
int r;
auto C = div(A,b,r); // 答案
for(int i = C.size() - 1;i >= 0;i --) cout<<C[i];
cout<<endl<<r<<endl;
return 0;
}
⑤高精度乘低精度(非本课习题)
#include<bits/stdc++.h>
using namespace std;
vector<int>multiply(vector<int>&A,int b){
vector<int>C;
int t = 0;
for(int i = 0; i < A.size(); i ++){
if(i < A.size()) t += A[i] * b;
C.push_back(t%10);
t = t/10;
}
while(t){
C.push_back(t % 10);
t /= 10;
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main(){
string a;
int b;
vector <int> A;
cin >> a >> b;
for(int i = a.size() - 1;i >= 0;i --)
A.push_back(a[i]-'0');
vector<int>C;
C = multiply(A,b);
for(int i = C.size()-1; i >= 0;i --) printf("%d",C[i]);
return 0;
}
更多习题答案,游戏代码,敬请关注。