發表於 2012-08-07 10:08|
csdn|
王然智慧型演算法
彙編程式設計c
摘要:演算法一直是程式設計師高階的一道龍門,通常演算法都是為了更高效地解決問題而創造的,但也有的只是出於學術性,並不在意其實際意義。這是近日在國外技術問答**stackoverflow的乙個熱門問題,不知道你能給出幾種解決方法?
問:在不使用*、/、+、-、%操作符的情況下,如何求乙個數的1/3?(用c語言實現)
第一種方法:使用位操作符並實現「+」操作
// 替換加法運算子原理:n = 4 * a + b; n / 3 = a + (a + b) / 3; 然後 sum += a, n = a + b 並迭代; 當 a == 0 (n < 4)時,sum += floor(n / 3); i.e. 1, if n == 3, else 0int add(int x, int y) while (a);
return b;
} int divideby3 (int num)
if (num == 3)
sum = add(sum, 1);
return sum;
}
第二種方法:
#include第三種方法:#include
int main()
log(pow(exp(number),0.33333333333333333333)) /* :-) */增強版:
log(pow(exp(number),sin(atan2(1,sqrt(8)))))第四種方法:
#include第五種方法:使用內聯彙編#include
int main(int argc, char *argv)
#include <第六種方法:stdio.h
>
int main()
// 注意: itoa 不是個標準函式,但它可以實現第七種方法:// don't seem to handle negative when base != 10
int div3(int i)
unsigned div_by(unsigned const x, unsigned const by)替換掉上面演算法的++運算子:return floor;
}
unsigned inc(unsigned x)這個版本更快一些:return 0; // 溢位(注意:這裡的x和mask都是0)
}
unsigned add(char第八種方法:實現乘法const zero, unsigned const x, unsigned const y)
unsigned div_by(unsigned const x, unsigned const by)
return floor;
}
int mul(int第九種方法:極限const x, int
const y) [x]);
}
public原理:static
int div_by_3(long a)
return (int) (a >> 32);
} public
static
long add(long a, long b)
因為, 1/3 = 1/4 + 1/16 + 1/64 + ...
所以,a/3 = a * 1/3
a/3 = a * (1/4 + 1/16 + 1/64 + ...)
a/3 = a/4 + a/16 + 1/64 + ...
a/3 = a >> 2 + a >> 4 + a >> 6 + ...
第十種方法:
public static int divideby3(int a)注:本例是c#實現,因為作者更熟悉c#,但本題更傾向於演算法,所以語言並不是太重要吧?(當然只是在不使用語言特性的前提下。)sub >
>= 1;
threes >
>= 1;
} if (negative) result = negate(result);
return result;
} public static int negate(int a)
public static int add(int a, int b)
return x;
}
不使用 操作符求乙個數的1 3
問 在不使用 操作符的情況下,如何求乙個數的1 3?用c語言實現 第一種方法 使用位操作符並實現 操作 替換加法運算子 int add int x,int y while a return b int divideby3 int num if num 3 sum add sum,1 return s...
C語言 統計乙個數中1的個數 移位操作符
移位運算子是將資料看成二進位制數,對其進行向左或向右移動若干位的運算。位移位運算子分為 右移和 移位時,移出的位數全部丟棄,移出的空位補入的數與左移還是右移花接木有關。如果是左移,則規定補入的數全部是0 如果是右移,還與被移位的資料是否帶符號有關。若是不帶符號數,則補入的數全部0 若是帶符號數,則補...
求乙個數約數的個數
求約數的個數 計算乙個整數的約數個數 輸入格式 輸入乙個整數 輸出格式 輸出一行,為輸入整數的約數的個數 樣例輸入 10 樣例輸出 4ac import math number int raw input count 0 sqrt float math.sqrt number if number s...