目录
当你觉得自己不行时,你就站在马路的行人线上,这时你就会变成一个行人
所有代码均经过测试AC通过
加法:
//洛谷1601
#include<iostream>
using namespace std;
int a[505],b[505],c[505];
string a1,b1;
int alen,blen;
int main(){
cin>>a1>>b1;
alen=a1.size();
blen=b1.size();
for(int i=0;i<alen;i++){
a[alen-i]=a1[i]-'0';
}
for(int i=0;i<blen;i++){
b[blen-i]=b1[i]-'0';
}
int l=max(alen,blen)+1;
for(int i=1;i<=l;i++){ //i<l也可以
c[i]+=a[i]+b[i];//!!!这里是累加
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
if(c[l]==0&&l>0)l--;
for(int i=l;i>0;i--){
cout<<c[i];
}
return 0;
}
减法:
//洛谷2142
#include<iostream>
using namespace std;
int a[10090],b[10090],c[10090];
string a1,b1,t;
int alen,blen;
int f;
int main(){
cin>>a1>>b1;
alen=a1.size();
blen=b1.size();
if(alen<blen){
t=a1;
a1=b1;
b1=t;
f=1;
}else if(alen==blen){
if(a1[0]-'0'>b1[0]-'0'){
t=a1;
a1=b1;
b1=t;
f=1;
}
}
alen=a1.size();
blen=b1.size();
for(int i=0;i<alen;i++){
a[alen-i]=a1[i]-'0';
}
for(int i=0;i<blen;i++){
b[blen-i]=b1[i]-'0';
}
int l=max(alen,blen)+1;
for(int i=1;i<=l;i++){
if(a[i]<b[i]){
a[i]+=10;
a[i+1]-=1;
}
c[i]=a[i]-b[i];
}
while(c[l]==0&&l>1)l--;//必须l>1
if(f==1) cout<<"-";
for(int i=l;i>0;i--){
cout<<c[i];
}
return 0;
}
乘法(两个非负整数):
//洛谷1303
#include<iostream>
using namespace std;
int a[4050],b[4050],c[4050]; //数组开到题目范围的二倍
string a1,b1;
int alen,blen;
int main(){
cin>>a1>>b1;
alen=a1.size();
blen=b1.size();
for(int i=0;i<alen;i++){
a[alen-i]=a1[i]-'0';
}
for(int i=0;i<blen;i++){
b[blen-i]=b1[i]-'0';
}
int l=alen+blen;
for(int i=1;i<=alen;i++){
for(int j=1;j<=blen;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
while(c[l]==0&&l>1)l--;
for(int i=l;i>0;i--){
cout<<c[i];
}
return 0;
}
除法:
高精度除低精度:
//高精度除低精度(洛谷1480)
#include<bits/stdc++.h>
using namespace std;
string a1;
typedef long long ll;
ll b,a[5010];
ll c[5010];
ll x;
ll alen,clen;
int main(){
cin>>a1>>b;
alen=a1.size();
for(int i=0;i<alen;i++){
a[i+1]=a1[i]-'0';
}
for(int i=1;i<=alen;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
clen=1;
while(c[clen]==0&&clen<alen)clen++;
for(int i=clen;i<=alen;i++){
cout<<c[i];
}
return 0;
}
高精度除高精度:
//高精度除高精度 核心:减法模拟
//这段代码没有 考虑被除数为0的情况
#include<bits/stdc++.h>
using namespace std;
char s1[305],s2[305];
int a[305],b[305],c[305],tmp[305];//a为被除数,b为除数,c为商
void init(int *x){
char s[305];
cin>>s;
x[0]=strlen(s);
for(int i=0;i<x[0];i++){
x[x[0]-i]=s[i]-'0';
}
}
void print(int a[]){
if(a[0]==0){
cout<<0;
return;
}
for(int i=a[0];i>0;i--)cout<<a[i];
return;
}
int compare(int a[],int b[]){ //返回1表示a>b,返回0表示a=b,返回-1表示a<b
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>0;i--){
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;
}
void minu(int a[],int b[]){
for(int i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]=a[i]+10;
}
a[i]=a[i]-b[i];
}
while(a[a[0]]==0&&a[0]>0) a[0]--;
}
void numcpy(int p[],int q[],int n){
for(int i=1;i<=p[0];i++) q[i+n-1]=p[i];//发现规律,求商的第i位就是加i-1个0
q[0]=p[0]+n-1;//重新记录数组长度
}
int main(){
init(a);//利用自定义函数init读入被除数a和除数b
init(b);//存入到a,b输出
c[0]=a[0]-b[0]+1;//c为商,数组a[0],b[0],c[0]均存的是各数组的长度
//发现规律,商的最大长度c=被除数的长度a-除数的长度b+1
// c=a/b
for(int i=c[0];i>=1;i--){ //for循环先求出商的最高位开始,利用减法模拟
memset(tmp,0,sizeof(tmp)); //重置tmp数组为0
numcpy(b,tmp,i); //为除数b增加相应的位数0
//例如:531518/123(上面有图) 先求最高位,需要先用531518连续减去123000
// 而numcpy函数就是给除数b补上后面的0
while(compare(a,tmp)>=0){ //这里用a一直减去补0后的b,直到减不过为止
c[i]++; //每减去一次就+1
minu(a,tmp); //这里模拟了一个高精度减法
}
}
while(c[c[0]]==0&&c[0]>0)c[0]--;
print(c); //商
cout<<endl;
print(a); //余数
return 0;
}