| ||||||||||
| 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 | |||||||||
哪位大师指点一下,我的程序哪里错了.代码有注释//思路:把物体的重量转化为 3 进制,如果在 i 位上有 2 则在左边加一个重量为 pow(3,i-1)的砝码
//最终左边的重量转化为只有0,1组成的3进制,右边需要放的砝码就是左边1所对应的权值
#include<stdio.h>
#include<math.h>
#include<string.h>
__int64 W;
__int64 weight[25]; //把 W 转化成3进制的各位数
int top; // 转化3进制时的栈顶指针
bool flag; //标记左边需不需要砝码
int right[25]; //在右边的砝码
int rCnt; //右边需要放的砝码数
int left[25]; //在左边的砝码
int lCnt; //左边需要放的砝码数
void init()
{
memset(right,0,sizeof(right));
memset(left,0,sizeof(left));
memset(weight,0,sizeof(weight));
rCnt=0;
lCnt=0;
flag=false;
top=0;
__int64 tempW;
scanf("%I64d",&W);
tempW=W;
while(tempW!=0) //转化为3进制
{
weight[++top]=(tempW%3); //转化为
tempW/=3;
}
}
void solve()
{
int i;
__int64 carry=0;
for(i=1;i<=(top+2);i++)
{
carry=weight[i]/3; // 是否有进位
weight[i]=weight[i]%3; //取余
weight[i+1]+=carry; //高位加进位
if(weight[i]==1) //如果为 1 则左边不需要放砝码
{
right[++rCnt]=i; // 右边放砝码
}
if(weight[i]==2) //如果为 2 则放一个砝码在左边,使之与物体相加得 0
{
flag=true; //左边需要放砝码
left[++lCnt]=i; //放一个砝码在左边
weight[i]=0;
weight[i+1]=(weight[i+1]+1); //高位 加 1
}
}
}
void display() //输出
{
int i;
if(!flag)
{
printf("empty ");
printf("%I64d",(__int64)pow((float)3,right[1]-1));
for(i=2;i<=rCnt;i++)
{
printf(",%I64d",(__int64)pow((float)3,right[i]-1));
}
printf("\n");
}
else
{
printf("%I64d",(__int64)pow((float)3,left[1]-1));
for(i=2;i<=lCnt;i++)
{
printf(",%I64d",(__int64)pow((float)3,left[i]-1));
}
printf("% I64d",(__int64)pow((float)3,right[1]-1));
for(i=2;i<=rCnt;i++)
{
printf(",%I64d",(__int64)pow((float)3,right[i]-1));
}
printf("\n");
}
}
int main(int argc, char* argv[])
{
int T;
scanf("%d",&T);
while(T--)
{
init();
solve();
display();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator