《數據結構上機實驗(C語言實現)》筆記(1 / 12):緒論

文章目錄

  • 驗證性實驗
    • 求1~n的連續整數和
      • 說明
      • 放碼
      • 結果
    • 常見算法時間函數的增長趨勢分析
      • 說明
      • 放碼
      • 結果
  • 設計性實驗
    • 求素數個數
      • 說明
      • 放碼
      • 結果
    • 求連續整數階乘的和
      • 說明
      • 放碼
      • 結果

驗證性實驗

求1~n的連續整數和

說明

對于給定的正整數n,求1+2+…+n1+2+…+n1+2++n,采用逐個累加和n(n+1)2\frac {n(n+1)} 22n(n1)?(高斯法)兩種解法。

對于相同的n,給出這兩種解法的求和結果和求解時間,并用相關數據進行測試。

  • clock_t類型、clock()函數和CLOCKS_PER_SEC常量均在time.h頭文件中聲明。
  • clock_t是時鐘數據類型(長整型數)
  • clock()函數返回CPU時鐘計時單元數(以毫秒為單位)
  • CLOCKSPER_SEC是一個常量,表示1秒包含的毫秒數。
  • 表達式((float) t)/CLOCKS_PER_SEC返回t轉換成的秒數;

放碼

//文件名:exp1-1.cpp//求1+2+...+n
#include <stdio.h>
#include <time.h>       // clock_t, clock, CLOCKS_PER_SEC
#include <math.h>//方法1:老實累加
long add1(long n)     
{long i, sum = 0;for (i = 1; i <= n; i++)sum += i;return(sum);
}void AddTime1(long n)  /* 采用方法1的耗時統計 */
{clock_t t = clock();long sum = add1(n);t = clock() - t;printf("方法1:\n");printf("  結果:1~%d之和:%ld\n", n, sum);printf("  用時:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//方法2:用公式
long add2(long n)     /* 方法2:求1+2+...+n */
{return(n * (n + 1) / 2);
}void AddTime2(long n) /* 采用方法2的耗時統計 */
{clock_t t = clock();long sum = add2(n);t = clock() - t;printf("方法2:\n");printf("  結果:1~%d之和:%ld\n", n, sum);printf("  用時:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}int main()
{int n;printf("n(大于1000000):");scanf("%d", &n);if (n < 1000000)return(0);AddTime1(n);AddTime2(n);return(1);
}

結果

n(大于1000000):99999999
方法1:結果:1~99999999之和:887459712用時:0.222000秒
方法2:結果:1~99999999之和:887459712用時:0.000000秒
請按任意鍵繼續. . .

常見算法時間函數的增長趨勢分析

說明

理解常見算法時間函數的增長情況。

對于1~n的每個整數n,輸log?2n\log_2nlog2?nn\sqrt nn?nnnnlog?2nn \log_2nnlog2?nn2n^2n2n3n^3n32n2^n2nn!n!n!

放碼

//文件名:exp1-2.cpp
#include <stdio.h>
#include <math.h>double log2(double x)	//求log2(x)
{return log10(x)/log10((double)2);
}long exponent(int n)	//求2^n
{long s=1;for (int i=1;i<=n;i++)s*=2;return s;
}long factorial(int n)	//求n!
{long s=1;for (int i=1;i<=n;i++)s*=i;return s;
}void fun(int n)
{printf("log2(n) sqrt(n)  n       nlog2(n)   n^2	    n^3	     2^n		n!\n");printf("===========================================================================\n");for (int i=1;i<=n;i++){printf("%5.2f\t",log2(double(i)));printf("%5.2f\t",sqrt((double)i));printf("%2d\t",i);printf("%7.2f\t",i*log2(double(i)));printf("%5d\t",i*i);printf("%7d\t",i*i*i);printf("%8d\t",exponent(i));printf("%10d\n",factorial(i));}
}int main()
{int n=10;fun(n);return 1;
}

結果

log2(n) sqrt(n)  n       nlog2(n)   n^2     n^3      2^n                n!
===========================================================================0.00    1.00    1         0.00     1         1        2                 11.00    1.41    2         2.00     4         8        4                 21.58    1.73    3         4.75     9        27        8                 62.00    2.00    4         8.00    16        64       16                242.32    2.24    5        11.61    25       125       32               1202.58    2.45    6        15.51    36       216       64               7202.81    2.65    7        19.65    49       343      128              50403.00    2.83    8        24.00    64       512      256             403203.17    3.00    9        28.53    81       729      512            3628803.32    3.16   10        33.22   100      1000     1024           3628800
請按任意鍵繼續. . .

設計性實驗

求素數個數

說明

通過對比同一問題不同解法的絕對執行時間 ,體會如何設計“好”的算法。

求1~n的素數個數。對于相同的n,給出這兩種解法的結果和求解時間,并用相關數據進行測試。

放碼

//文件名:exp1-3.cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>		 	//clock_t, clock, CLOCKS_PER_SEC
#include <math.h>//------方法1-----------------------------------------------
bool prime1(long n) //方法1:判斷正整數n是否為素數
{long i;for (i = 2; i < n; i++)if (n % i == 0)return false; //若n不是素數,則退出并返回falsereturn true;
}void PrimeTime1(long n) //采用方法1的耗時統計
{long sum = 0, i;clock_t t = clock();for (i = 2; i <= n; i++)if (prime1(i))sum++;t = clock() - t;printf("方法1:\n");printf("  結果:2~%d的素數個數:%d\n", n, sum);printf("  用時:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//------方法2-----------------------------------------------
bool prime2(long n) //方法2:判斷正整數n是否為素數
{long i;for (i = 2; i <= (int)sqrt((double)n); i++)//對n開方進行優化if (n % i == 0)return false; //若n不是素數,則退出并返回falsereturn true;
}
void PrimeTime2(long n) //采用方法2的耗時統計
{long sum = 0, i;clock_t t = clock();for (i = 2; i <= n; i++)if (prime2(i))sum++;t = clock() - t;printf("方法2:\n");printf("  結果:2~%d的素數個數:%d\n", n, sum);printf("  用時:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//------方法3-----------------------------------------------
int countPrimes(long n) //方法3:埃拉托色尼篩選法,空間換時間,n不能過大,否則程序報錯
{bool *flag = (bool *)malloc(n * sizeof(bool));for (long i = 0; i < n; i++)//這步不能省略,否則得不到正確值flag[i] = 0;int count = 0;for (long i = 2; i < n; i++){if (flag[i] == 0){count++;for (long j = i; i * j < n; j++) {flag[i * j] = 1;}}}free(flag);return count;
}
void PrimeTime3(long n) //采用方法3的耗時統計
{long sum = 0;clock_t t = clock();sum = countPrimes(n);t = clock() - t;printf("方法3:\n");printf("  結果:2~%d的素數個數:%d\n", n, sum);printf("  用時:%lf秒\n", ((float)t) / CLOCKS_PER_SEC);
}//------------------------------------------------------------
int main() {long n;printf("n(取值范圍[10000, 40000]):");scanf("%d", &n);if (!(10000 <= n && n <= 40000)) return 0;PrimeTime1(n);PrimeTime2(n);PrimeTime3(n);return 1;
}

結果

n(取值范圍[10000, 40000]):40000
方法1:結果:2~40000的素數個數:4203用時:0.236000秒
方法2:結果:2~40000的素數個數:4203用時:0.009000秒
方法3:結果:2~40000的素數個數:4203用時:0.001000秒
請按任意鍵繼續. . .

求連續整數階乘的和

說明

對于給定的正整數n,求1!+2!+3!+…+n !。給出一種時間復雜度為O(n)的解法。

放碼

//文件名:exp1-4.cpp
#include <stdio.h>//循環版
long Sum(int n) {long sum = 0, fact = 1;for (int i = 1; i <= n; i++) {fact *= i;sum += fact;}return sum;
}//TODO:遞歸版//------------------------------------------------------------
int main() {int n;printf("n(3-20):");scanf("%d", &n);if (n < 3 || n > 20) return 0;printf("1!+2!+…+%d!=%ld\n", n, Sum(n));return 1;
}

結果

n(3-20):15
1!+2!+…+15!=1443297817
請按任意鍵繼續. . .

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線性表實現一元多項式操作

數組存放&#xff1a; 不需要記錄冪&#xff0c;下標就是。 比如1&#xff0c;2&#xff0c;3&#xff0c;5表示12x3x^25x^3 有了思路&#xff0c;我們很容易定義結構 typedef struct node{float * coef;//系數數組int maxSize;//最大容量int order;//最高階數 }Polynomial…

ubuntu下解壓縮zip,tar,tar.gz和tar.bz2文件

在Linux下面如何去壓縮文件或者目錄呢&#xff1f; 在這里我們將學習zip, tar, tar.gz和tar.bz2等壓縮格式的基本用法。 首先了解下Linux里面常用的壓縮格式。 在我們探究這些用法之前&#xff0c;我想先跟大家分享一下使用不同壓縮格式的經驗。當然&#xff0c;我這里講到的只…

《數據結構上機實驗(C語言實現)》筆記(2 / 12):線性表

文章目錄驗證性實驗實現順序表各種基本運算的算法放碼sqlist.hsqlist.cppexp2-1.cpp結果實現單鏈表各種基本運算的算法放碼linklist.hlinklist.cppexp2-2.cpp結果實現雙鏈表各種基本運算的算法放碼dlinklist.hdlinklist.cppexp2-3.cpp結果實現循環單鏈表各種基本運算的算法放碼…

鏈表排序-歸并

鏈表排序&#xff0c;可以插入排序&#xff0c;我就不寫了。 實現歸并排序 歸并排序&#xff08;MERGE-SORT&#xff09;是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&…

ubuntu麒麟下安裝并啟用搜狗輸入法

1.首先打開UK軟件&#xff0c;輸入搜狗尋找搜狗拼音軟件 然后下載搜狗拼音軟件 接著點擊啟動該軟件 2.點擊搜狗拼音的圖標&#xff0c;進入搜狗拼音的設置窗口 點擊高級&#xff0c;并打開FCITX設置 加入英語輸入法 3.這樣就可以進行中英文切換了

線性表表示集合

集合我們高中都學過吧&#xff1f; 最重要的幾個特點&#xff1a;元素不能重復、各個元素之間沒有關系、沒有順序 集合內的元素可以是單元素或者是集合。 對集合的操作&#xff1a;交集并集差集等&#xff0c;還有對自身的加減等。 需要頻繁的加減元素&#xff0c;所以順序…

家用無線路由器購買入門指南

視頻一&#xff1a;「白問」普通大眾 買路由器關注這幾個點就夠了 來源 例如商品名&#xff1a;AC 1200M 雙頻 AX前綴wifi6IEEE 802.11 AX AC前綴wifi5IEEE 802.11 AC AX比AC好 1200M 理論峰值 和網速無關 商家噱頭 MIMO SU-MIMO 單用戶多進多出&#xff08;早期&#xff…

ubuntu linux下執行.sh文件

ubuntu linux下執行.sh文件 首先&#xff0c;要確保這個文件的類型是可執行的。 有兩種辦法把文件設置為可執行文件。 1) 直接在文件屬性標簽中選中 "可執行"&#xff0c;--b 如果用的是圖形界面&#xff0c;這個方法最簡單直接。 2) 使用命令 chmod x file.sh。將可…

鏈表相交問題

本來想自己寫&#xff0c;寫了一半發現一篇文章&#xff0c;解釋寫得簡單易懂&#xff0c;我就直接拿過來了。 這個問題值得反復地寫&#xff0c;鍛煉鏈表coding能力的好題。 //如果兩個鏈表都不帶環 int NotCycleCheckCross(pLinkNode head1,pLinkNode head2) {pLinkNode lis…

用JS寫了一個模擬串行加法器

在重溫《編碼&#xff1a;隱匿在計算機軟硬件背后的語言》第12章——二進制加法器時&#xff0c;心血來潮用JS寫了一個模擬串行加法器。 測試斷言工具TestUtils.js function assertTrue(actual){if(!actual)throw "Error actual: " actual " is not true.&q…

Android學習路線總結

title: Android學習路線總結&#xff0c;絕對干貨 tags: Android學習路線,Android學習資料,怎么學習android grammar_cjkRuby: true --- 一、前言 不知不覺自己已經做了幾年開發了&#xff0c;由記得剛出來工作的時候感覺自己能牛X&#xff0c;現在回想起來感覺好無知。懂的越…

雙棧

利用棧底位置相對不變的特性&#xff0c;可以讓兩個順序棧共享一個空間。 具體實現方法大概有兩種&#xff1a; 一種是奇偶棧&#xff0c;就是所有下標為奇數的是一個棧&#xff0c;偶數是另一個棧。但是這樣一個棧的最大存儲就確定了&#xff0c;并沒有起到互補空缺的作用&a…

Error when loading the SDK:解決方案

錯誤情況&#xff1a; 當打開eclipse時出現如下窗口&#xff08;內容如下&#xff09; Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windows-x86_64-20140702\sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml cvc-complex-type…

單調隊列優化的背包問題

對于背包問題&#xff0c;經典的背包九講已經講的很明白了&#xff0c;本來就不打算寫這方面問題了。 但是吧。 我發現&#xff0c;那個最出名的九講竟然沒寫隊列優化的背包。。。。 那我必須寫一下咯嘿嘿&#xff0c;這么好的思想。 我們回顧一下背包問題吧。 01背包問題 …

用Python去除掃描型PDF中的水印

內容概述 含水印掃描型PDF文件&#xff0c;其中某頁如下圖所示&#xff0c;用Python去除其頁頂及頁底的水印。 處理思路&#xff1a;PDF中的每一頁的水印的相對位置基本相同&#xff0c;將PDF每一頁輸出成圖片&#xff0c;然后進行圖片編輯&#xff0c;用白色填充方形覆蓋水印…

鏈表實現棧

棧&#xff0c;是操作受限的線性表&#xff0c;只能在一端進行插入刪除。 其實就是帶尾指針的鏈表&#xff0c;尾插 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define Status int #define SElemType int //只在頭部進行插入和刪除(…

二階有源濾波器

濾波器是一種使用信號通過而同時抑制無用頻率信號的電子裝置, 在信息處理、數據傳送和抑制干擾等自動控制、通信及其它電子系統中應用廣泛。濾波一般可分為有源濾波和無源濾波, 有源濾波可以使幅頻特性比較陡峭, 而無源濾波設計簡單易行, 但幅頻特性不如濾波器, 而且體積較大。…

用JS寫了一個30分鐘倒計時器

效果圖 額外功能 左鍵單擊計時器數字區&#xff0c;不顯示或顯示秒鐘區。左鍵雙擊計時器數字區&#xff0c;暫停或啟動計時器。計時完畢&#xff0c;只能刷新頁面啟動計時器。輸入框可輸入備注信息&#xff0c;輸入框失去焦點或計時完畢后&#xff0c;時間戳附帶備注信息會存入…

為什么高手離不了Linux系統?我想這就是理由!

通過本文來記錄下我在Linux系統的學習經歷&#xff0c;聊聊我為什么離不了Linux系統&#xff0c;同時也為那些想要嘗試Linux而又有所顧忌的用戶答疑解惑&#xff0c;下面將為你介紹我所喜歡的Linux系統&#xff0c;這里有一些你應該知道并為之自豪的事實。 這里你應該首先拋開W…

python學習實例(1)

# #1.2 計算機編程的基本概念 ## #1.2.2 從Python語言進入計算機語言的世界 ##<程序&#xff1a;例子1> def F(x,y):return(x*xy*y) print("F(2,2)",F(2,2)) print("F(3,2)",F(3,2))#<程序&#xff1a;例子2> def Pr():for i in range(0,10)…