E - Chinese Girls’ Amusement (高精度&数论)

思路:



AC代码:

#include<cstdio>
#include<cstring>
using namespace std;
const int N=5e3+5;
int a[N],b[N],l;
char s[N];
void divi(int *a,int f){
	 int p=0,len=l;
	 for(int i=len-1;i>=0;i--) //高精减低精. 
	 {
	 	 b[i]=(a[i]+p*10)/2;
	 	 p=(a[i]+p*10)%2;
	 }
	 while(b[len-1]==0) len--;
	 if(f&&(b[0]&1)) f++; //对偶数讨论 如果不是4m 则减两次1. 
	 for(int i=0;i<f;i++){ 
	 	int k=0;
	 	 while(b[k]==0) b[k]=9,k++;
		 b[k]--;
	 }
	 while(b[len-1]==0) len--;
	 for(int i=len-1;i>=0;i--) printf("%d",b[i]);
	 puts("");
}
int main(){
	int n;
	scanf("%d",&n);
	while(n--){
		memset(b,0,sizeof b);
		scanf("%s",s);
		 l=strlen(s);
		for(int i=0;i<l;i++)
			a[l-1-i]=s[i]-'0';
		if(a[0]&1) divi(a,0);
		else divi(a,1);
		if(n) puts("");
	}
	return 0;
}