首页 > 代码库 > 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;}
J ugly problem

 

2016中国大学生程序设计竞赛(长春)-重现赛 题解