完善程序题求助
  • 板块灌水区
  • 楼主Hyacinths
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/7/21 09:04
  • 上次更新2023/11/3 08:31:36
查看原帖
完善程序题求助
561985
Hyacinths楼主2023/7/21 09:04

rt.

高精度除法压位优化:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
const int siz=8;
const long long MOD=1e8;//MOD=10^si
char ch1[MAXN],ch2[MAXN];
long long n;
long long a[MAXN>>2],b[MAXN>>2],s[MAXN>>2];
long long cp[MAXN>>2],lt[MAXN>>2],wsd[MAXN>>2];
void write(long long num[]) {
	printf("%lld",num[num[0]]);
	for(int i=num[0]-1; i; --i) printf("%08lld",num[i]);
	puts("");
}
void clear(long long num[]) {
	for(int i=num[0]; i; --i) num[i]=0;
	num[0]=1;
}
void ry(long long num[]) {
	for(int i=num[0]; i; --i) {
		if(       (1)          ) num[i-1]+=MOD;//将1借到下一位   
		num[i]>>=1;
	}
	if(!num[num[0]]&&num[0]>1) --num[0];
}
void ly(long long num[]) { //乘2
	++num[0]; //0位存位数
	for(int i=1; i<=num[0]; ++i) {
		num[i]<<=1;
		if(num[i-1]>=MOD) num[i-1]-=MOD,++num[i];
	}
	if(!num[num[0]]&&num[0]>1) --num[0]; 
	return;
}
void cpy(long long num1[],long long num2[]) {
	for(int i=num1[0]; i>num2[0]; --i) num1[i]=0;
	for(int i=0; i<=num2[0]; ++i) num1[i]=num2[i];
}
int cmp(long long num1[],long long num2[]) {
	if(num1[0]>num2[0]) return 1;
	if(num1[0]<num2[0]) return -1;
	for(int i=num1[0]; i; --i) {
		if(num1[i]>num2[i]) return 1;
		if(num1[i]<num2[i]) return -1;
	}
	return 0; 
}
void init() {
	scanf("%s%s",ch1,ch2);
	int l1=strlen(ch1),l2=strlen(ch2);
	for(int i=l1-1; i>=0; i-=siz) {
		long long pw=1;
		++a[0];
		for(int j=i; j>i-siz&&j>=0; --j) {
			a[a[0]]+=(ch1[j]^48)*pw;
			pw=(pw<<3)+(pw<<1);
		}
	}
	for(int i=l2-1; i>=0; i-=siz) {
		long long pw=1;
		++b[0];
		for(int j=i; j>i-siz&&j>=0; --j) {
			b[b[0]]+=(ch2[j]^48)*pw;
			pw=(pw<<3)+(pw<<1);
		}
	}
	return;//反序读入存储
}
void pls(long long a[],long long b[]) {
	clear(s);
	s[0]=max(a[0],b[0])+1;
	for(int i=1; i<=s[0]; ++i) {
		s[i]+=a[i]+b[i];
		if(s[i]>=MOD) s[i]-=MOD,++s[i+1];//进位
	}
	if(!s[s[0]]&&s[0]>1) --s[0];
	return;
}
void mnu(long long a[],long long b[]) {
	clear(s);
	s[0]=max(a[0],b[0]);
	for(int i=1; i<=s[0]; ++i) {
		s[i]+=a[i]-b[i];
		if(s[i]<0) s[i]+=MOD,--s[i+1];//借位
	}
	while(!s[s[0]]&&s[0]>1) --s[0];
	return;
}
void div(long long a[],long long b[]) {
	clear(cp),cp[1]=1;
	clear(lt);
	while(cmp(a,b)!=-1)      (2)    ;    
	while(cp[0]>1||cp[1]) {
		if(cmp(a,b)!=-1) {
			mnu(a,b),        (3)      ;   
			       (4)       ;  
		}
		       (5)        ;
	}
	cpy(s,lt),cpy(lt,a);
	return;
}
int main() {
	init();
	clear(s);
	div(a,b);
	write(s);
	write(lt);
	return 0;
}

第一处填(  )。(3 分)

A.i>1
B.(num[i]&1)&&i>1
C.num[i]&1
D.(num[i]|1)&&i>1

第二处填(  )。(3 分)

A.ly(a),ly(lt)
B.ly(b),ly(cp)
C.ly(lt)
D.ly(b),ly(s)

第三处填(  )。(3 分)

A.cpy(b,s)
B.cpy(s,a)
C.cpy(a,b)
D.cpy(a,s)

第四处填(  )。(3 分)

A.mnu(lt,cp),cpy(lt,s)
B.cpy(lt,s)
C.pls(lt,cp),cpy(lt,s)
D.pls(s,cp),cpy(a,s)

第五处填(  )。(3 分)

A.ry(b),ry(cp)
B.ry(a),ly(cp) 
C.ly(a),ly(cp)
D.ry(b),ly(cp)
2023/7/21 09:04
加载中...