C***U 发帖数: 2406 | 1 我在自己电脑上用位移的算法做出来了
code写的有点长 但是例子都能过
但是在leetcode上一直超时 不知道为什么 |
I*****8 发帖数: 37 | 2 这种情况,你说代码比较长,那就应该是复杂度的问题把。你把代码贴出来看看把 |
j*****o 发帖数: 394 | 3 Q群里有人帖了个通过ONLINE JUDGE的代码版本
就是你的复杂度太高了
【在 C***U 的大作中提到】 : 我在自己电脑上用位移的算法做出来了 : code写的有点长 但是例子都能过 : 但是在leetcode上一直超时 不知道为什么
|
r*****e 发帖数: 30 | 4
什麼群?
【在 j*****o 的大作中提到】 : Q群里有人帖了个通过ONLINE JUDGE的代码版本 : 就是你的复杂度太高了
|
C***U 发帖数: 2406 | 5 复杂度logn
明天贴
这种情况,你说代码比较长,那就应该是复杂度的问题把。你把代码贴出来看看把
★ Sent from iPhone App: iReader Mitbbs 7.56 - iPad Lite
【在 I*****8 的大作中提到】 : 这种情况,你说代码比较长,那就应该是复杂度的问题把。你把代码贴出来看看把
|
m******r 发帖数: 42 | 6 新手土鳖问题:你在自己电脑上怎么拷贝测试结果?是你自己写了caller
然后手工对照结果?好像没看到leetcode有import数据的地方啊。
【在 C***U 的大作中提到】 : 我在自己电脑上用位移的算法做出来了 : code写的有点长 但是例子都能过 : 但是在leetcode上一直超时 不知道为什么
|
C***U 发帖数: 2406 | 7 我直接写上return 1
然后他会把例子显示出来 当然我的结果都是1 都是错误的
然后我把例子再输入到我电脑里面
笨办法
【在 m******r 的大作中提到】 : 新手土鳖问题:你在自己电脑上怎么拷贝测试结果?是你自己写了caller : 然后手工对照结果?好像没看到leetcode有import数据的地方啊。
|
C***U 发帖数: 2406 | 8 不是科班出生 写代码 比较丑 别取笑我
int divide(int dividend, int divisor) {
int flag = 1;
unsigned int x;
unsigned int y;
unsigned int z;
unsigned int i = 0;
unsigned int count = 0;
int result = 0;
if(!divisor) {
cout << "could not be divided by 0" << endl;
return 0;
}
if(dividend < 0) {
flag = -1;
dividend = - dividend;
}
if(divisor < 0) {
if(flag < 0)
flag = 1;
else
flag = -1;
divisor = - divisor;
}
x = dividend;
y = divisor;
z = y;
while(x >= z) {
i++;
z = z << 1;
}
i--;
if(i < 0)
return 0;
for(int j = i; j >= 0; j--) {
z = y;
z = z << j;
count = 0;
while(x >= z) {
x -= z;
count++;
}
result += count << j;
}
if(flag > 0)
return result;
else
return - result;
}
【在 I*****8 的大作中提到】 : 这种情况,你说代码比较长,那就应该是复杂度的问题把。你把代码贴出来看看把
|
m*****n 发帖数: 204 | 9 try -2147483648 / -2147483648
My code got into infinite loop. Looks like your code have the same problem.
【在 C***U 的大作中提到】 : 我在自己电脑上用位移的算法做出来了 : code写的有点长 但是例子都能过 : 但是在leetcode上一直超时 不知道为什么
|
q***y 发帖数: 24 | 10 溢出了
注意leetcode会输入最小的int,取负后无法用int表示
【在 C***U 的大作中提到】 : 不是科班出生 写代码 比较丑 别取笑我 : int divide(int dividend, int divisor) { : int flag = 1; : unsigned int x; : unsigned int y; : unsigned int z; : unsigned int i = 0; : unsigned int count = 0; : int result = 0; : if(!divisor) {
|
|
|
C***U 发帖数: 2406 | 11 恩 我之前注意这个了
所以才用unsigned int
我改成unsigned long
结果还是溢出 处理这个问题好像要单独拿出来
【在 q***y 的大作中提到】 : 溢出了 : 注意leetcode会输入最小的int,取负后无法用int表示
|
q***y 发帖数: 24 | 12 你哪用unsigned int了?
你仔细看你的代码,还是用int存,所以溢出了
【在 C***U 的大作中提到】 : 恩 我之前注意这个了 : 所以才用unsigned int : 我改成unsigned long : 结果还是溢出 处理这个问题好像要单独拿出来
|
C***U 发帖数: 2406 | 13 我把dividend和divisor存到x y里面都是unsigned int了
下面这个代码对了 通过leetcode的验证了 只不过写的很丑
把最小的数拿出来单独处理了
int divide(int dividend, int divisor) {
int flag = 1;
unsigned long int x;
unsigned long int y;
unsigned long int z;
unsigned int i = 0;
unsigned int count = 0;
int result = 0;
if(!divisor) {
cout << "could not be divided by 0" << endl;
return 0;
}
if(dividend == -2147483648) {
if(divisor > 0) {
dividend += divisor;
result = divide(dividend, divisor) - 1;
}
else {
dividend -= divisor;
result = divide(dividend, divisor) + 1;
}
return result;
}
if(dividend < 0) {
flag = -1;
x = - dividend;
}
else
x = dividend;
if(divisor < 0) {
if(flag < 0)
flag = 1;
else
flag = -1;
y = - divisor;
}
else
y = divisor;
z = y;
while(x >= z) {
i++;
z = z << 1;
}
i--;
if(i < 0)
return 0;
for(int j = i; j >= 0; j--) {
z = y;
z = z << j;
count = 0;
while(x >= z) {
x -= z;
count++;
}
result += count << j;
}
if(flag > 0)
return result;
else
return - result;
}
【在 q***y 的大作中提到】 : 你哪用unsigned int了? : 你仔细看你的代码,还是用int存,所以溢出了
|
C***U 发帖数: 2406 | 14 谢谢你前面的指正
确实是最小的整数的时候溢出的原因
【在 q***y 的大作中提到】 : 你哪用unsigned int了? : 你仔细看你的代码,还是用int存,所以溢出了
|
h*****3 发帖数: 1391 | 15 个人意见啊,你这程序还可以改进的合理些。
比如看是否是负数,其实用个bool就可以了,初始为false,每次遇见负数取反就可以
了。
如果divisor是1,直接返回dividend。。。 |
C***U 发帖数: 2406 | 16 恩 你说的bool那个是对的
1那个没必要把 那样code更长了
【在 h*****3 的大作中提到】 : 个人意见啊,你这程序还可以改进的合理些。 : 比如看是否是负数,其实用个bool就可以了,初始为false,每次遇见负数取反就可以 : 了。 : 如果divisor是1,直接返回dividend。。。
|
d******a 发帖数: 238 | 17 写了个递归的。
int divhelper(int a, int b)
{
if (a <= b)
return a / b;
int shift = 0;
while ((b << shift) <= a)
shift++;
return (1 << (shift - 1)) + divhelper(a - (b << (shift - 1)), b);
}
int div1(int a, int b)
{
assert(b != 0);
int sign;
if ((a >= 0 && b > 0) || (a < 0 && b < 0))
sign = 1;
else
sign = -1;
long long int c = abs(a);
long long int d = abs(b);
int result = divhelper(c , d);
return sign * result;
} |
C***U 发帖数: 2406 | 18 不能用除法的
【在 d******a 的大作中提到】 : 写了个递归的。 : int divhelper(int a, int b) : { : if (a <= b) : return a / b; : : int shift = 0; : : while ((b << shift) <= a) : shift++;
|
d******a 发帖数: 238 | 19 if (a <= b)
return a / b;
改成
if (a < b)
return 0;
if (a == b)
return 1; |
C***U 发帖数: 2406 | 20 恩
你写的比我好多了
我的太长了
【在 d******a 的大作中提到】 : if (a <= b) : return a / b; : 改成 : if (a < b) : return 0; : if (a == b) : return 1;
|