1-2+3-4+5-6+7......+nのいくつかの実現
2528 ワード
本文の内容自身は1つの名門校のコンピュータ生の一回の面接の経歴から来て、ほほほ、間違いなくて、あなたの推測は正しいで、きっと私ではありません
个人はこの2つの问题が大好きで、テーマはもともと2つだけではないかもしれませんが、もちろん、私のここでは私の好きな2つを分析しています.
1.パラメータがn(nが大きい)場合の値1-2+3-4+5-6+7を計算する関数を書く.n面接の経纬を见て、私はとても代表的だと思って、そこで、私はこのテーマを持って私のいくつかの学友に闻いて、私はみんながこのテーマの第1の実现の方式を手に入れることを见たいです.みんなが私にくれた反応も予想通りで、直接forループを書くと言っていました.それから、みんなはプログラマーが一番好きな間違いを犯しました.それはすべての仕事をcpuに任せることです.もしかすると、今のコンピュータは、運行速度がそんなに速くて、このようなプログラムを実行してcpuにもたらす効率の問題を考える必要はありません.この問題については、以下で議論します.
この名門校生が初めて答えたのを見てください.
この答えは面接官が満足していないので、2番目の答えを出しました.
個人的には卒業したばかりの4年生の面接者にとって、もう容易ではないと思います.もちろん、これらよりもよくできる人がいるに違いありません.彼は元のコードの中で乗除した場所を加減法に変えました.私たちはコンピュータが加減比して乗除効率が高いことを知っています.多くのコンピュータの乗除は最終的に加減法に変換されるからです.
面接官はまだ満足していないが、この4年生の面接は焦っていて、最善の案が思いつかなかった.最良の答えしか求められない.
ほほほ、私もとても惊いて、确かに、nがとても大きい时、このアルゴリズムは上の2种类のアルゴリズムより何倍强いか分かりません.
これは、上述したように、プログラマーはすべての仕事をコンピュータに捨てることができず、コンピュータのcpuはプログラマーに使うのではなく、ユーザーに使うのです.
「CPUの演算速度が速いとは思わないで、すべての問題をそれに押し付けて、プログラマーはコードを最適化してから最適化すべきで、私たち自身ができることは決してCPUにやらせないでください.CPUはユーザーのためにサービスしているので、私たちのプログラマーのためにサービスしているわけではありません!」どんなに精巧な言語でも、私はもう何も言いたくありません.
上のアルゴリズムはもう優れていると思いますが、私の同級生は上のアルゴリズムに基づいてもっと優れていると思います.
加減算効率は乗除効率よりも高く,シフト演算は多くの場合加減算効率よりも高いことを知った.
2.1つの関数で2つの関数を実現するためのテクニック的なプログラミング方法nは、次のようなものである.
fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6! fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9!
次に、関数fn(int n,int flag)で実現し、flagが0の場合、fn 1機能を実現し、flagが1の場合、fn 2機能を実現します.要求はやはり効率、効率、効率!
答えは次のとおりです.
2 D配列float tを定義する[2][5]格納[2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!]次に、ループを指定します.
for(i=0;i<6;i++) { temp=temp+n/t[flag][i]; } ほほほ、巧みではないでしょうか.典型的な空間交換時間のアルゴリズム!
个人はこの2つの问题が大好きで、テーマはもともと2つだけではないかもしれませんが、もちろん、私のここでは私の好きな2つを分析しています.
1.パラメータがn(nが大きい)場合の値1-2+3-4+5-6+7を計算する関数を書く.n面接の経纬を见て、私はとても代表的だと思って、そこで、私はこのテーマを持って私のいくつかの学友に闻いて、私はみんながこのテーマの第1の実现の方式を手に入れることを见たいです.みんなが私にくれた反応も予想通りで、直接forループを書くと言っていました.それから、みんなはプログラマーが一番好きな間違いを犯しました.それはすべての仕事をcpuに任せることです.もしかすると、今のコンピュータは、運行速度がそんなに速くて、このようなプログラムを実行してcpuにもたらす効率の問題を考える必要はありません.この問題については、以下で議論します.
この名門校生が初めて答えたのを見てください.
long fn(long n)
{
long temp=0;
int i,flag=1;
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
for(i=1;i<=n;i++)
{
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}
この答えは面接官が満足していないので、2番目の答えを出しました.
long fn(long n)
{
long temp=0;
int j=1,i=1,flag=1;
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
while(j<=n)
{
temp=temp+i;
i=-i;
i>0?i++:i--;
j++;
}
return temp;
}
個人的には卒業したばかりの4年生の面接者にとって、もう容易ではないと思います.もちろん、これらよりもよくできる人がいるに違いありません.彼は元のコードの中で乗除した場所を加減法に変えました.私たちはコンピュータが加減比して乗除効率が高いことを知っています.多くのコンピュータの乗除は最終的に加減法に変換されるからです.
面接官はまだ満足していないが、この4年生の面接は焦っていて、最善の案が思いつかなかった.最良の答えしか求められない.
long fn(long n)
{
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}
ほほほ、私もとても惊いて、确かに、nがとても大きい时、このアルゴリズムは上の2种类のアルゴリズムより何倍强いか分かりません.
これは、上述したように、プログラマーはすべての仕事をコンピュータに捨てることができず、コンピュータのcpuはプログラマーに使うのではなく、ユーザーに使うのです.
「CPUの演算速度が速いとは思わないで、すべての問題をそれに押し付けて、プログラマーはコードを最適化してから最適化すべきで、私たち自身ができることは決してCPUにやらせないでください.CPUはユーザーのためにサービスしているので、私たちのプログラマーのためにサービスしているわけではありません!」どんなに精巧な言語でも、私はもう何も言いたくありません.
上のアルゴリズムはもう優れていると思いますが、私の同級生は上のアルゴリズムに基づいてもっと優れていると思います.
long fn(long n)
{
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n>>1)*(-1);
else
return (n>>1)*(-1)+n;
}
加減算効率は乗除効率よりも高く,シフト演算は多くの場合加減算効率よりも高いことを知った.
2.1つの関数で2つの関数を実現するためのテクニック的なプログラミング方法nは、次のようなものである.
fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6! fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9!
次に、関数fn(int n,int flag)で実現し、flagが0の場合、fn 1機能を実現し、flagが1の場合、fn 2機能を実現します.要求はやはり効率、効率、効率!
答えは次のとおりです.
2 D配列float tを定義する[2][5]格納[2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!]次に、ループを指定します.
for(i=0;i<6;i++) { temp=temp+n/t[flag][i]; } ほほほ、巧みではないでしょうか.典型的な空間交換時間のアルゴリズム!