首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一道大赛题目解决办法

2012-04-27 
一道大赛题目5个砝码用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。如果只有5个砝码,重量

一道大赛题目
5个砝码
  用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1

要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
有思想说说思想,最好贴点代码,别整空的

[解决办法]
void poised(int select[],int n,int x,int poise[])
{
int i;
/*转换为标准的三进制数*/
for(i=0; i<n; i++)
{
select[i]=x%3;
x=x/3;
}
/*调整为偏移三进制码*/
for(i=0;i<n-1;i++)
{
if(select[i]>1)
{
select[i] -= 3;
select[i+1]++;
}
}
}

int main(int argc, char *argv[])
{
clock_t start=clock(),stop;
int x,i;
int w[6];
int firstflag;/*输出首项标志*/
int poise[]={1,3,9,27,81,243};/*可以推广到任意多个砝码*/
for(x=1; x<=364; x++)
{
poised(w,6,x,poise);
printf("%4d = ",x);
firstflag=1;
for(i=5; i>=0; i--)
{
if(w[i]==0)
continue;
if(firstflag)
{
printf("%d",poise[i]);
firstflag=0;
}
else
printf(" %c %d ",(w[i]==-1)?'-':'+',poise[i]);
}
printf("\n");
}
system("PAUSE");
return 0;
}

[解决办法]
#include<iostream>
#include<math.h>
using namespace std;
void func()
{
int rem[100],sem[100],yem[100],xem[100];
int ten,quo;
int i=0, m=0,q1=0,q2=0;
cout<<"输入十进制数:";
cin>> ten;
cout<<endl;
quo=ten;
rem[99]=0;
while(quo!=0&&i<20)
{ rem[i]= quo%3;
quo/=3;
i++;
}
if(i==20)
{cout<<"输入值过大";
return; 

m=i-1;
for(int k=0;k<=i-1;k++)
{ sem[k+1]=rem[m];
m--;
}
sem[0]=0;
//yem[]存储 所加 数。
for(int k=i;k>=1;k--)
{ if (sem[k]==2)
{ sem[k]+=1;
yem[q1]=(int)pow(3.0,i-k);
q1++;
}
if (sem[k]==3)
{sem[k]=0;
sem[k-1]+=1;
}
}
for (int k=0;k<q1;k++)
{ cout<<"-"<<yem[k];
}
//xem[] 存储结果数,
for (int x=0;x<=i;x++)
{
if(sem[x]==1)
{ xem[q2]=pow(3.0,i-x);
q2++;
}
}
for (int k=0;k<q2;k++)
{ cout<<"+"<<xem[k];
}
cout<<endl;
}
void main()
{ do{
func();
cout<<endl;
}while (1);
system("pause");
}
这是我编的。。
但是
输入一个超大值为什么屏幕死循环 ,停不下来。。。。
高手指点。。
[解决办法]
[code=C/C++][/code]
#include<stdio.h>
void scale_conv(int data,int scale,int a[5])
{
int i;
if(data>121) return ;
for(i=0;i<5;i++)
a[i]=0;
i=0;
while(data>=scale)
{
a[i]=data%scale;
data = data/scale;
i++;
}
a[i]=data;
}
int main(int argc,char** argv)
{
int i,x,first;
int a[5];
int tab[5]={1,3,9,27,81};
while(1)
{
first = 0;
printf("输入一个正整数(1~121):\n");
scanf("%d",&x);
scale_conv(x,3,a);

for(i=0;i<4;i++)
{
if(a[i]==2)
{
a[i]=-1;
a[i+1]+=1;
}
else if(a[i]==3)
{
a[i]=0;
a[i+1]+=1;
}

}
printf("%d=",x);
for(i=5;i>=0;i--)
{
if(a[i]==1)
{
if(first==0)
printf("%d",tab[i]);
else 
printf("+%d",tab[i]);
first = 1;
}
if(a[i]==-1)
printf("-%d",tab[i]);
}
printf("\n");
}
}

热点排行