
一道ACM水题。。c语言。。怎么回事 30
我在vc上可以运行的,但是在电子科技大学oj上竟然是CE。。Krolia的计时难题1784时间是最难以捉摸的东西,光是测量它们就已经很难了。一般而言,测量时间用一个可重复...
我在vc上可以运行的,但是在电子科技大学oj上竟然是CE。。
Krolia的计时难题 1784
时间是最难以捉摸的东西,光是测量它们就已经很难了。一般而言,测量时间用一个可重复等时长发生的事件来定义最小的时间可测单位。于是Krolia想到了一个测量时间的好方法。
Krolia有一盒火柴,如果把火柴的头去掉火柴就会变成一样长的木棍。Krolia知道一根(没有火柴头)木棍一端点燃后,整个燃烧会持续x时间。Krolia还可以从两端同时点燃木棍,这样燃烧会持续x/2时间。现在Krolia想用这堆火柴来计时,问什么样的时间可以被完全精确地计算出。
Input
第一行一个整数T(T<=1000),表示有T组测试数据,每组测试数据行三个整数a,b,x(1<=a,b,x<=10^9)表示要测量a/b,一根火柴的燃烧时长是x间。
Output
一个字符串,"YES"或者"NO"表示能或者不能被精确计算。
Sample Input
4
1 1 1
1 2 1
1 4 1
1 5 1
Sample Output
YES
YES
YES
NO
#include<stdio.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long int a,b,x;int i,j,m,n;
scanf("%ld%ld%ld",&a,&b,&x);
m=b*x;
if(m>a) n=a;
else n=m;
for(i=n;i>0;i--)
if(m%i==0&&a%i==0) break;
for(j=0;;j++)
if(pow(2,j)<=(m/i)&&pow(2,j+1)>(m/i))
break;
if(pow(2,j)==(m/i))
printf("YES\n");
else printf("NO\n");
}
return 0;
} 展开
Krolia的计时难题 1784
时间是最难以捉摸的东西,光是测量它们就已经很难了。一般而言,测量时间用一个可重复等时长发生的事件来定义最小的时间可测单位。于是Krolia想到了一个测量时间的好方法。
Krolia有一盒火柴,如果把火柴的头去掉火柴就会变成一样长的木棍。Krolia知道一根(没有火柴头)木棍一端点燃后,整个燃烧会持续x时间。Krolia还可以从两端同时点燃木棍,这样燃烧会持续x/2时间。现在Krolia想用这堆火柴来计时,问什么样的时间可以被完全精确地计算出。
Input
第一行一个整数T(T<=1000),表示有T组测试数据,每组测试数据行三个整数a,b,x(1<=a,b,x<=10^9)表示要测量a/b,一根火柴的燃烧时长是x间。
Output
一个字符串,"YES"或者"NO"表示能或者不能被精确计算。
Sample Input
4
1 1 1
1 2 1
1 4 1
1 5 1
Sample Output
YES
YES
YES
NO
#include<stdio.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long int a,b,x;int i,j,m,n;
scanf("%ld%ld%ld",&a,&b,&x);
m=b*x;
if(m>a) n=a;
else n=m;
for(i=n;i>0;i--)
if(m%i==0&&a%i==0) break;
for(j=0;;j++)
if(pow(2,j)<=(m/i)&&pow(2,j+1)>(m/i))
break;
if(pow(2,j)==(m/i))
printf("YES\n");
else printf("NO\n");
}
return 0;
} 展开
4个回答
展开全部
假设a,b,x已经输入。
//算法未考虑精度缺失
while(a>bx)
a-=bx;
int i=0;
bool flag;
while(1)
{
if(x/(2^i))*b>a)
{++i;continue;}
if(x/(2^i-1)*b<a)
{flag=false;break;}
a-=x/(2^i))*b;
if(a==0)
{flag=true;break;}
}
if(flag) cout<<"Yes\n";
else cout<<"No\n";
//算法未考虑精度缺失
while(a>bx)
a-=bx;
int i=0;
bool flag;
while(1)
{
if(x/(2^i))*b>a)
{++i;continue;}
if(x/(2^i-1)*b<a)
{flag=false;break;}
a-=x/(2^i))*b;
if(a==0)
{flag=true;break;}
}
if(flag) cout<<"Yes\n";
else cout<<"No\n";
追问
我写的是c,c++看不明白呀
追答
c、 c++都一样的,把输出函数cout换成scanf()就可以了。
展开全部
代码逻辑覆盖不完整。
该题目可以抽象成为一个数学模型:
输入a、b、x,
求a/b=x*Σ(1/2^i)
该题目可以抽象成为一个数学模型:
输入a、b、x,
求a/b=x*Σ(1/2^i)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
并没有在杭电上找到这题。
如果说问题的话,那应该是你的C语言程序不是严格符合标准,即第九行long int a,b,x;int i,j,m,n;
不应该有,因为C语言是不能在图中申请变量的,可以的是C++,在VC6.0当中是可以运行的,但严格来说是不符合C语言要求的,如果OJ是GCC编译的话,当然CE了
如果说问题的话,那应该是你的C语言程序不是严格符合标准,即第九行long int a,b,x;int i,j,m,n;
不应该有,因为C语言是不能在图中申请变量的,可以的是C++,在VC6.0当中是可以运行的,但严格来说是不符合C语言要求的,如果OJ是GCC编译的话,当然CE了
追问
什么叫不能在图中申请变量?
追答
就是申请变量都要在开始的时候
即是函数的开头就要申请,后面就不能申请了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可能是pow(2,j)这个CE了,pow里面的参数要是double型的
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询