데이터 구조 과목 에 설 치 된 큰 정수 사 칙 연산
6857 단어 데이터 구조
당시 에 선생님 은 진짜 변 태 를 구 하려 고 했 기 때문에 시스템 이 가지 고 있 는 스 택, 배열 로 저장 할 수 없 었 고 반드시 스스로 스 택 을 쓰 고 링크 로 큰 수 를 저장 해 야 했다.
main:
#include
#include
#include
#include
#include
#include
#include
#include
head: #include
#include
using namespace std;
//******************************************************************************
const int Base=10000,seg=4;
//******************************************************************************
void trans(string ch,int *s){//
int i,k=1;
int L=ch.size()-seg;
for(i=L;i>=0;i-=seg,k++){// , .
s[k]=ch[i]-'0';
for(int j=i+1;j=Base){
c=sum[i]/Base;
sum[i]%=Base;
}else c=0;
}
if(c>0){
sum[i]=c;
sum[0]=i;
}
else sum[0]=i-1;
}
//******************************************************************************
void sub(int *A,int *B,int *sum){//
int c=0;
for(int i=B[0]+1;i<=A[0];++i)B[i]=0;
for(int i=1;i<=A[0];++i){
sum[i]=A[i]-B[i]+c;
if(sum[i]<0){
sum[i]+=Base;
c=-1;
}else c=0;
}
sum[0]=1;
for(int i=A[0];i>=1;--i){
if(sum[i]){
sum[0]=i;
break;
}
}
}
//******************************************************************************
void mult(int *A,int *B,int *sum){//
int i,j,k;
int all=A[0]+B[0]-1;
memset(sum,0,sizeof(int)*(all+3));
for(i=1,k=1;i<=A[0];++i){
k=i;
if(A[i]){
for(j=1;j<=B[0];++j,++k){
sum[k]+=A[i]*B[j];
if(sum[k]>=Base){
sum[k+1]+=sum[k]/Base;
sum[k]=sum[k]%Base;
}
}
}
}
while(sum[k]>=Base){
sum[k+1]+=sum[k]/Base;
sum[k]=sum[k++]%Base;
}
if(!sum[k])k--;
sum[0]=k;
}
//******************************************************************************
// a,b
bool cmp(int *a,int *b){
if(a[0]>b[0])return true;
if(a[0]=1;--i){
if(a[i]>b[i])return true;
if(a[i]=1;--i,++j){
if(a[t]>b[i])return j;
if(a[t]=0;--i)sum[i]=0;
for(int i=k,t=m;i>=1,t>=n;){
int p=cmp(a,b,t);//a[t]-b[n]
if(p<0 && t == n)break;
if(p == 0){
sum[i]++;
for(int j=t;j>=t-n+1;--j)a[j]=0;
t-=n;
if(t1){
sum[i]++;
for(int j=t,q=n;j>=t-n+1;--j,--q)a[j]-=b[q];
for(int j=t-n+1;j<=t;++j){
if(a[j]<0){
a[j]+=Base,a[j+1]--;
}
}
int j;
for(int j=t;j>=t-n+1;--j)if(a[j])break;
if(jn){
a[t-1]+=a[t]*Base;
a[t]=0;
--t;
--i;
}
if(p == 1){
int x=a[t]/(b[n]+1);
sum[i]+=x;
for(int j=t,q=n;q>=1;--q,--j)a[j]-=x*b[q];
for(int j=t-n+1;j<=t;++j){
while(a[j]<=-Base1000){a[j]+=Base1000,a[j+1]-=1000;}
while(a[j]<=-Base100){a[j]+=Base100,a[j+1]-=100;}
while(a[j]<=-Base10){a[j]+=Base10,a[j+1]-=10;}
while(a[j]<=0){a[j]+=Base,a[j+1]-=1;}
}
}
}
if(sum[k] == 0)sum[0]=k-1;else sum[0]=k;
/*int i;
for(i=m;i>=1;--i)if(a[i])break;
if(i == 0)copy(r,zero);
else{
r[0]=i;
while(i >= 1)r[i]=a[i--];
}*/
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.