C ++の単一行

画像
ハブには、さまざまな言語の「単一行」に関するいくつかのトピックがあり、簡単な問題を解決しました。 C / C ++でいくつかのアルゴリズムを公開することにしました。
さあ、行こう!

1.ユークリッドアルゴリズム


最大公約数を見つけるための再帰的アルゴリズム。
int GCD(int a,int b) { return b?GCD(b,a%b):a; } 


2. NOCを見つける


最小公倍数を見つけるための再帰的アルゴリズム。
 int LCM(int a,int b) { return a/GCD(a,b) * b; } 


3.数字の確認2 ^ n


次数2の数値をチェックするアルゴリズム。
 int isPow2(int a) { return !(a&(a-1)); } 


4. 2つの変数を交換する機能


このアルゴリズムは、XORにある3番目の変数を必要としない対称差分プロパティを使用して機能します。
 void swap(int *a, int *b) { *a ^= (*b ^= (*a ^= *b)); } 


5.べき乗アルゴリズム


線形時間での数値の程度。
再帰が終了する条件:数値の次数が0の場合、a ^ 0 = 1。
 int pow(int a,int n) { return (!n)?1:a*pow(a,n-1); } 


6.インドのべき乗アルゴリズム


対数時間における数値の累乗。
 int powInd(int a,int n) { return (!n)?1:((n&1)?a:1)*powInd(a*a,n/2); } 


7.階乗数


非負整数nの階乗。
再帰条件の継続:階乗はnまでのすべての自然数の積です。
再帰が終了する条件:数値が0の場合、0!= 1。
 int fac(int n) { return n?n*fac(n-1):1; } 


8.数字の桁の合計


再帰を継続するための条件:数値の桁の合計は、最後の桁に最後の桁のない数値の桁の合計を加えたものに等しくなります。
再帰が終了する条件:数値が0の場合、数字の合計は0です。
 int count(int a) { return (!a)?0:(a%10+count(a/10)); } 


9.フィボナッチ数


フィボナッチ数-後続の各数値が前の2つの数値の合計に等しい数値シーケンスの要素。
 int fib(int n) { return (n<=2)?1:(fib(n-1)+fib(n-2)); } 


10.次のフィボナッチ数


フィボナッチ数を見つける機能。
 int fibNext(int &f1,int &f2) { return f1=(f2+=f1)-f1; } 


11.メルセンヌ数


メルセンヌ数-形式の数 画像
 int Mersen(int n) { return !(n&(n+1)); } 


12.最小および最大


 int max(int a,int b) { return (a>b)?a:b; } int min(int a,int b) { return (a>b)?b:a; } 


13. 2つの数値の比較


この関数は2つの数値の差の値を返します。そのため、差が0より大きい場合、数値aはbより大きく、0の場合、数値は同じです。それ以外の場合、数値aはbより小さいです。
 template <typename TYPE> int compare (const TYPE a, const TYPE b){ return ( a - b ); } 


14.数2のn乗


ユニティをnビットシフトして、n次の2を計算します。
 int pow2(int n) { return 1<<n; } 


komentからの単一行


LertmindからNOCを見つける

 int lcm(int a, int b) { return (b < 1 ? (b ? lcm(b, a % b) : a) : (a / -lcm(-b, -a % b) * b)); } 


Mrrlの数値の非ゼロビットの数

 int NBit(unsigned int x){ return x==0 ? 0 : (x&1)+NBit(x>>1); } 


Mrrlからのnで割った最大2のべき乗

 int MaxDivPow2(int n){ return n&-n; } 


Lertmindからの2つの数値の比較

 int cmp(int a, int b) { return (a < b ? -1 : (a > b ? 1 : 0)); } 

またはパターン
 template<typename T> int cmp(const T &a, const T &b) { return (a < b ? -1 : a > b); } 


Mrrlからint *配列のk番目のビットを見つけます(sizeof(int)== 4と仮定)

 int GetBit(int *a,int k){ return (a[k>>5]>>(k&31))&1; } 


私はコメントでより多くのアルゴリズムを待っています...

Source: https://habr.com/ru/post/J146793/


All Articles