diff --git a/HDOJ/5920_dgutfly.cpp b/HDOJ/5920_dgutfly.cpp new file mode 100644 index 0000000..469804f --- /dev/null +++ b/HDOJ/5920_dgutfly.cpp @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +const double eps=1e-8; +int len; +//大数乘法 +void subtract(char *a,char *b,char *c) +{ + for(int i=len-1;i>=0;i--) + { + c[i]=a[i]-b[i]+'0'; + if(c[i]<'0')c[i]+=10,a[i-1]--; + } +} + +char str[2][1005],sub[50][1005]; +int main() +{ + int i,j,k,n; + scanf("%d",&n);getchar(); + for(int h=1;h<=n;h++) + { + memset(sub,'0',sizeof(sub)); + gets(str[0]); + len=strlen(str[0]); + int old=1,now=0; + int cnt=0; + for(i=0;str[now][i];)//前置0到末尾,整个数就是0 + { + old^=1,now^=1;//滚动数组 + if(!strcmp(str[old]+i,"10"))//10=9+1 + { + sub[cnt][0]='9';sub[cnt][1]=0;cnt++; + sub[cnt][0]='1';sub[cnt][1]=0;cnt++; + break; + } + for(j=i;j<=len-1-j+i && str[old][j]<=str[old][len-1-j+i];j++); + strcpy(sub[cnt],str[old]); + if(j=0 && sub[cnt][j]<'0';j--)sub[cnt][j]+=10,sub[cnt][j-1]--; + } + for(j=0;sub[cnt][j]=='0';j++);//去前导0 + for(k=j;k<=len-1-k+j;k++)sub[cnt][len-1-k+j]=sub[cnt][k];//根据前半串对折构造后半串 + sub[cnt][len]=0; + subtract(str[old],sub[cnt],str[now]); + for(;str[now][i]=='0';i++); + cnt++; + } + printf("Case #%d:\n%d\n",h,cnt); + for(i=0;i