高精度挑错(玄关)谢
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/3/9 18:05
  • 上次更新2024/3/9 20:10:14
查看原帖
高精度挑错(玄关)谢
1246532
封禁用户楼主2024/3/9 18:05

题目为输入x,输出1+2+3+...+x x最大为10200010^{2000}

我的方法是高斯求和公式也就是n*(n+1)/2

用到高精度算法

#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001],c[100001],ans[10001],n;
int c1,a1,b1,ans1;
void add(){//加法 
	c1=a1;
	int carry=0;//进位 
	b[0]=(a[0]+1)%10;//因为首相就是1所以n+1可以转换成a数组的个位加1 
	carry=b[1]/10;
	for (int i=1;i<c1;++i){
    	int t=a[i]+carry;
    	carry = t/10;
    	b[i] = t%10;
    	//cout<<a[i]<<" "<<b[i]<<" "<<carry<<" "<<c[i]<<endl;
	}
	b[b1]+=carry;
	if(b[b1])++b1;
} 
void chef(){//乘法 
	c1=a1+b1-1;
	for (int i=0;i<a1;++i){
 	   for (int j=0;j<b1;++j){
    	    c[i+j]+=a[i]*b[j];
    	}
	}
	for (int i=0;i<=c1;++i){//处理进位 
   	 	c[i+1]+=c[i]/10;
    	c[i]%=10;
	}
	if (c[c1])++c1;
	//cout<<c1<<" "<<c[c1]<<endl;
	for(int i=c1-1;i>=0;--i){
		cout<<c[i];
	}
}
void chuf(){//除法高精度除2(也就是单精度) 
	long long r=0;
	for (int i=c1-1;i>=0;--i){
    	r=r*10+c[i];
    	ansi]=r/2; 
   	 	r%=2; 
	}
	while (c1>1&&ans[c1-1]==0)--c1;
	for(int i=c1-1;i>=0;--i){//输出反过来 
		cout<<ans[i];
	}
}
int main(){	

	string  A;
	cin>>A;
	a1=A.size();
	for(int i=a1-1;i>=0;i--){
		a[a1-1-i]=A[i]-'0';
	}
	//倒序 10变为a[0]=0,a[1]=1也就是01 
	b1=a1;
	add();
	chef();
	chuf();
	return 0;
}
2024/3/9 18:05
加载中...