swjtu oj 1589 Help Alice!

来源:互联网 发布:sql delete加标记 编辑:程序博客网 时间:2024/06/14 10:49

http://acm.swjtu.edu.cn/JudgeOnline/showproblem?problem_id=1589

没涉及到什么算法,两个二进制数,求最大公约数,但是这两个数字必须用字符串表示,算是要求自己模板吧,这里给出我AC的程序:二进制字符串的减法和取模运算.


#include <stdio.h>#include <string>typedef struct { char s[202]; }answer;  answer OPT[201][21]; //OPT[i][j],??s????????i????????????j??????????????????????char *plus(char *a , char *b,int p,int i) {  char s[250],sum[250];  int k=0;  for(k=0;p+k<=i;k++)  s[k]=b[p+k];  sum[0]='0';  int la=strlen(a);  int length=la>k?la:k;  int min=la<k?la:k;  int sign=0,m;  length+=1;  for(m=0;m<min;m++){   sum[length-m-1]=a[la-m-1]+s[k-m-1]+sign-'0';   if(sum[length-m-1]>'9') {sum[length-m-1]-=10;sign=1;}  else     sign=0;   }   while(m<la) {sum[length-m-1]=a[la-m-1]+sign;               if(sum[length-m-1]>'9') {sum[length-m-1]-=10;sign=1;}                else     sign=0;m++;}  while(m<k) {sum[length-m-1]=s[k-m-1]+sign;       if(sum[length-m-1]>'9') {sum[length-m-1]-=10;sign=1;}     else     sign=0;m++;}  if(sum[0]=='0'&&sign==1) sum[0]='1';  sum[length]='\0';  if(sum[0]=='0')  return sum+1;  else  return sum;  }void fun(char *s,int m); int aSmaller(char *a,char *b){  int la,lb;  la=strlen(a);  lb=strlen(b);  if(la<lb) return 1;  else  if(la>lb) return 0;   else    {     int i;     for(i=0;i<la;i++)      if(a[i]<b[i]) return 1;      else      if(a[i]>b[i]) return 0; }  return 0;  } char *plus(char *a , char *b,int p,int i);int main()  {   int n;   scanf("%d",&n);    while(n--)     {      char s[201];      int m;   scanf("%s%d",s,&m);    fun(s,m);      }     return 0;   }   void get(char *a,char *s,int i)   {    int j=0;    for(j=0;j<i;j++)    a[j]=s[j];    a[j]='\0';    }  void fun(char *s,int m)  {    int ls=strlen(s);         int j,i;  for(j=0;j<=m;j++)   strcpy(OPT[0][j].s,"0");       for(i=0;i<=ls;i++)     get(OPT[i][0].s,s,i);   strcpy(OPT[0][0].s,"0");   for(i=1;i<=ls;i++)    for(j=1;j<=m;j++)    {      if(j>=i) {strcpy(OPT[i][j].s,OPT[i][j-1].s);continue;}      char min[250]; char sum[250];   strcpy(sum,plus(OPT[i-1][j-1].s,s,i-1,i-1));   strcpy(min,sum);    int p;    for(p=i-2;p>=0;p--)    {         strcpy(sum,plus(OPT[p][j-1].s,s,p+1-1,i-1));     if(aSmaller(sum,min))           strcpy(min,sum);          }     strcpy(OPT[i][j].s,min);   }printf("%s\n",OPT[ls]­.s);    }