| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求教,牛人看看呗。OLE。。。#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
char strx[5][50]={"|||||||||||||||||||||||||||||||||||||||||||||||||",
"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
"9999999999999999999999999999999999999999999999999",
"8888888888888888888888888888888888888888888888888",
"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"
};
void change(int a,char * str)
{
int q[6];
int k;
q[5]=a/10000;
q[4]=(a%10000)/1000;
q[3]=(a%1000)/100;
q[2]=(a%100)/10;
q[1]=a%10;
for(k=1;k<6;k++)
switch(k)
{
case 1:if(q[1]==0)
break;
strncat(str,strx[0],q[1]);
strcat(str," ");
break;
case 2:if(q[2]==0)
break;
strncat(str,strx[1],q[2]);
strcat(str," ");
break;
case 3:if(q[3]==0)
break;
strncat(str,strx[2],q[3]);
strcat(str," ");
break;
case 4:if(q[4]==0)
break;
strncat(str,strx[3],q[4]);
strcat(str," ");
break;
case 5:if(q[5]==0)
break;
strncat(str,strx[4],q[5]);
strcat(str," ");
break;
}
return ;
};
int main()
{
char str1[64],str2[64],str[64],strr[40][64],stru[64];
int a,b,i,j,k,temp,sum,mark[30],num[30];
int q[6];
while(gets(str1))
{
gets(str2);
for(i=0,b=0;i<strlen(str2);i++)
{
switch (str2[i])
{
case '|':b+=1;break;
case 'n':b+=10;break;
case '9':b+=100;break;
case '8':b+=1000;break;
case 'r':b+=10000;break;
}
}/* 计算出乘数;*/
for(i=0,a=0;i<strlen(str1);i++)
{
switch (str1[i])
{
case '|':a+=1;break;
case 'n':a+=10;break;
case '9':a+=100;break;
case '8':a+=1000;break;
case 'r':a+=10000;break;
}
}/* 计算出被乘数;*/
memset(mark,0,sizeof(mark));
memset(num,0,sizeof(num));
/*memset(strr,0,sizeof(strr));
memset(stru,0,sizeof(stru));*/
for(i=0;i<40;i++)
for(j=0;j<64;j++)
strr[i][j]=0;
for(i=0;i<64;i++)
{
stru[i]=0;
}
for(i=28,sum=0;i>=0;i--)
{
temp=pow(2,i);
if(sum+temp>b)
continue;
sum+=temp;
mark[i]=1;
if(sum==b)
break;
}/*标记出相加数的位置*/
for(i=28;i>=0;i--)
if(mark[i]==1)
{
j=i;
break;
}/*找到纵队的列数 */
for(i=1,num[0]=a;i<=j;i++)
{
num[i]=num[i-1]*2;
}
for(i=0,sum=0;i<=j;i++)
{
if(mark[i])
sum+=num[i];
}
for(i=0;i<=j;i++)
{
change(num[i],strr[i]);
}
for(i=0;i<=j;i++)
{
temp=(int)pow(2,i);
for(k=0;k<64;k++)
str[k]=0;
change(temp,str);
if(mark[i])
{
strcat(str,"*");
printf("%-34s%s\n",str,strr[i]);
}
else
printf("%-34s%s\n",str,strr[i]);
}
change(sum,stru);
printf("The solution is: %s\n",stru);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator