設計函式,計算s 1 2 3 4 5 6N的值,要求時間複雜度為O 1 ,越簡潔獨特越好

2021-05-04 21:49:24 字數 4028 閱讀 5613

1樓:匿名使用者

1樓的有點問題,中間應該是加

sum = (0 - (n >> 1)) + ((n & 0x01) ? n : 0);

1樓的是最標準的答案了,一看就知道c的功底相當厲害。

只可惜樓主沒采納。遺憾。

2樓:

可以用公式的

觀察到1-2=-1

3-4=-1

5-6=-1

如果n是奇數的話

答案是-(n-1)/2+n

如果n是偶數的話答案是-n/2

#include

#include

int sum(int n)

int main()

3樓:匿名使用者

化簡表示式:

s = 1-2+3-4+5-6+...±n=(1-2)+(3-4)+(5-6)...(n-1-n) =-1-1-1-1-1...-1=-n/2 (n為偶數)

=(1-2)+(3-4)+(5-6)...+n = -1-1-1-1-1-1...-1+n=-(n-1)/2+n=n/2+1/2=(n+1)/2 (n為奇數)

則可得以下函式:

int function(int nt)

那麼從函式來看,function中nt%2步數為1,後面的兩個算式均為1,而兩個算是隻會執行一個,return步數為1,那麼function的步數為3,時間複雜度為t(function) = o(1),符合要求

4樓:匿名使用者

int fun(int s,int i)

else

return s;}

5樓:

sum = (0 - (n >> 1)) - ((n & 0x01) ? n : 0);

2.陣列a[n],存放了1至n-1個數,其中某個數重複一次。寫一個函式,找出被重複的數字.時間複雜度必須為o(n

6樓:

演算法思想:先對1..n-1之間的所有整數累加求和,再對陣列中的所有元素累加求和;用後者減去前者得到的差就是重複的數字。

參考源**(c++):

#include "iostream.h"

void main()

;int n = 7;

int sum1, sum2;

int i;

for(i=1,sum1=0; i

for(i=0,sum2=0; i

cout<<"重複的數字是 "<

} 時間複雜度:o(n)

演算法特點:對於陣列中數值的出現順序不做任何要求,即無需有序(這是二樓演算法的缺陷)。

7樓:匿名使用者

a[n]中存放了的數的範圍是1至n-1嗎?

8樓:匿名使用者

#include

#define n 10

int main()

;int i;

for(i=0;i化,語句為:

for(i=0;i是:從1到n-1有n-1個數,所以,重複的數只有一個,而且陣列的值有一定的規律,即array[i]=i+1, 那麼我們就可以根據這個來找到重複的資料了,即只要前面這個等式不成立,那麼這個數就找到了,輸出即可。

用c++函式描述個演算法,並求出時間複雜度

9樓:匿名使用者

#include

int max=0,may=0;

int array[5][5];

void remax()

快速排序方法的時間複雜度為o(n^2)=n(n-1)/2.

10樓:匿名使用者

1)對於你的問題簡單解釋如下:

理論計算機研究中,衡量演算法一般從兩個方面分析:時間複雜度和空間複雜度。空間複雜度跟時間複雜度是類似的,下面簡單解釋一下時間複雜度:

對於一個資料規模為n的問題,解決該問題的演算法所用時間可以用含有n的函式t(n)來表示。對於絕大多數情況,我們只需要瞭解演算法的一般效能而不考慮細節,也就是說,我們只關心函式t(n)的表示式的形式,而不關心表示式的常數係數等與資料規模沒有關係的量值。對於函式t(n),我們又進一步將它簡化為o(n),即只考慮演算法平均執行時間的「瓶頸」,也就是t(n)表示式中,關於變數n增長最快的哪一項。

比如下面的**:

for(int i=1; i<=n*2; i++)for(int j=1; j<=n; j++)// do something here

那麼這個演算法的時間複雜度就是o(n^2),因為它有兩層迴圈,每層迴圈的資料規模都是n。注意第一層迴圈(外迴圈)要迭代n*2次,則實際上t(n)=2*n*n,而對於o(n)來說,我們忽略了常數2,只保留了n^2。這就是大o記法的一個概括,並不精確。

對於時間複雜度的更精確、深入的解釋,可以自己查閱《演算法導論》第一章。

2)更正你的問題:快速排序演算法的時間複雜度應該為o(n lg n)。注意三種時間複雜度符號表示的不同意義!

英文字母o代表的是平均執行時間,因此對於快速排序來說應該是o(n lg n)。而使用下界函式omega或者上界函式theta則分別表示演算法執行的最快和最慢時間。對於未使用隨機化的快速排序,理論上可以證明,存在某一方法構造出一組資料使快速排序「退化」成平方複雜度演算法即theta(n^2)。

但是對於其o(n)表示法應該為o(n^2)。

11樓:匿名使用者

n 趨於無窮大時無窮大的階數。

同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。

電腦科學中,演算法的時間複雜度是一個函式,它定量描述了該演算法的執行時間。這是一個關於代表演算法輸入值的字串的長度的函式。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。

使用這種方式時,時間複雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。

演算法設計與分析 已知某個演算法的時間複雜度t(n)=o(f(n)),f(n)是什麼函式?t(n)和f(n)是什麼關係?

12樓:匿名使用者

時間複雜度

演算法分析

同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間複雜度和空間複雜度來考慮。

1、時間複雜度

(1)時間頻度

一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。

一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。

(2)時間複雜度

在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間複雜度為o(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如t(n)=n2+3n+4與t(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為o(n2)。

按數量級遞增排列,常見的時間複雜度有:

常數階o(1),對數階o(log2n),線性階o(n),

線性對數階o(nlog2n),平方階o(n2),立方階o(n3),...,

k次方階o(nk),指數階o(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

用vb程式設計計算1 2 3 4 5 6 n的值,n由文字框輸

樓上的程式,個人認為有點小問題,修改如下 private sub form click dim n as integer dim sum as integer sum 0 n val inputbox 輸入一個整數 sum 0 for i 1 to n 此處修改sum sum 1 i 1 i 此處修...

用C語音程式設計計算1 2 3 4 5 6 n的值,n由文字框輸入,要求時間複雜度為O(1)

sum 0 n 1 n 0x01 n 0 main include void main vb程式設計計算1 2 3 4 5 6 n的值,n由使用者輸入 dim n as long,m as longdim i as long n val text1.text m 0for i 1 to n m m ...

編寫函式計算1234n,其中n的值由主調函式

include int main 函式計算1 2 3 4 n,n的值由主調函式傳入,計算結果並返回 使用公式精簡 int sum int n fun int n main fun int n return sum 我剛考bai完計算機二級duc,所以記得比較清楚,希zhi望能幫到你dao inclu...