首页 > 代码库 > 2016中国大学生程序设计竞赛(长春)-重现赛 题解
2016中国大学生程序设计竞赛(长春)-重现赛 题解
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;}
2016中国大学生程序设计竞赛(长春)-重现赛 题解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。