C 为什么我在Lightoj 1176问题上得到TLE?
问题:Ekka和他的朋友Dokka决定买一块蛋糕。他们都喜欢蛋糕,这就是为什么他们买了蛋糕后想分享蛋糕的原因。顾名思义,Ekka非常喜欢奇数,Dokka非常喜欢偶数,他们想把蛋糕分成N平方厘米,Dokka得到M平方厘米,其中N是奇数,M是偶数。N和M都是正整数 他们想要分割蛋糕,使得N*M=W,其中W是他们设置的冲刺因子。现在你知道了他们的冲刺因素,你就得看看他们是否能买到想要的蛋糕 输入 输入以整数T开始≤ 10000,表示测试用例的数量 每个案例都包含一个整数w2≤ W<2^63。W不是2的幂 输出 对于每个案例,首先打印案例编号。在那之后,如果他们买不到他们想要的蛋糕,就不可能打印出来。如果他们可以买这样的蛋糕,你必须打印N和M。如果有多个解决方案,那么打印结果,其中M尽可能小 时限:2秒 我尝试了样本输入,得到了与输出相同的结果 样本输入 三, 十, 五, 十二, 样本输入的输出 案例1:5 2 案例2:不可能 案例3:3 4 我的代码:C 为什么我在Lightoj 1176问题上得到TLE?,c,C,问题:Ekka和他的朋友Dokka决定买一块蛋糕。他们都喜欢蛋糕,这就是为什么他们买了蛋糕后想分享蛋糕的原因。顾名思义,Ekka非常喜欢奇数,Dokka非常喜欢偶数,他们想把蛋糕分成N平方厘米,Dokka得到M平方厘米,其中N是奇数,M是偶数。N和M都是正整数 他们想要分割蛋糕,使得N*M=W,其中W是他们设置的冲刺因子。现在你知道了他们的冲刺因素,你就得看看他们是否能买到想要的蛋糕 输入 输入以整数T开始≤ 10000,表示测试用例的数量 每个案例都包含一个整数w2≤ W>2除以2来测试它是否
#include<stdio.h>
#include<math.h>
int main()
{
int t,k;
scanf("%d",&t);
for(k=1;k<=t;k++)
{
int a,i,j=1,c;
scanf("%d",&a);
for(i=2;i<sqrt(a)+2;i++)
{
if(a%i==0 && i%2!=0)
c=i;
}
int b=a/c;
if(b%2==0 && b*c==a)
printf("Case %d: %d %d\n",k,c,b);
else
printf("Case %d: Impossible\n",k);
}
return 0;
}
光给了我的解决方案TLE。你的解决方案给了TLE
也许你需要对它进行一些优化
我建议的一件事是:
如果数字W不能被2整除,则无法打印
如果数字W可以被2整除,则继续将该数字除以2,直到它变成奇数
因此,生成的奇数将是一个共享,而W/odd_数将是另一个共享。通常,人们会使用探查器和其他计时技术来找出代码中的热点和瓶颈。但在在线评委/竞赛网站上,这是不可能的,不仅因为你不能使用这些工具,甚至在代码计时方面,而且因为他们很少告诉你他们作为你的程序输入的数据。如果你想用正确的方法学习C,那就去读一些书,或者上几节课。这将使你成为一个比这类网站更好的程序员。问题陈述说W可以大到2^63,这不适合整数变量。尝试使用long-long。你的代码很可能还有其他问题。如果a是素数,那么在你的循环之后c会有什么值?除此之外:欢迎使用SO。请尝试为您的问题找到一个有用的标题。对于没有参加任何编码竞赛的人来说,这个标题没有任何意义,也可能不会吸引很多读者。@Gerhardh如果a是素数,答案将是“不可能的”。谢谢你的建议。既然W是整数,你可以用W&1=0,用W>>2除以2来测试它是否应该是W>>1?