J. Ugly problem
题意:把大数字拆成不超过50个的回文数
题解:每次用不超过大数字的回文数去减,得到的结果要再这样执行,注意"10"这个数的坑点
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <cstdlib> #include <vector> #include <set> #include <map> 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];) { old^=1,now^=1; if(!strcmp(str[old]+i,"10")) { 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<len-1-j+i) { sub[cnt][(i+len-1)/2]--; for(j=(i+len-1)/2;j>=0 && sub[cnt][j]<‘0‘;j--)sub[cnt][j]+=10,sub[cnt][j-1]--; } for(j=0;sub[cnt][j]==‘0‘;j++); 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<cnt;i++) { char *s; for(s=sub[i];*s==‘0‘;s++); puts(s); } } return 0; }
J ugly problem
时间: 2024-10-15 13:50:04