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);
}