日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论

發(fā)布時(shí)間:2023/12/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 驗(yàn)證性實(shí)驗(yàn)
    • 求1~n的連續(xù)整數(shù)和
      • 說明
      • 放碼
      • 結(jié)果
    • 常見算法時(shí)間函數(shù)的增長趨勢分析
      • 說明
      • 放碼
      • 結(jié)果
  • 設(shè)計(jì)性實(shí)驗(yàn)
    • 求素?cái)?shù)個(gè)數(shù)
      • 說明
      • 放碼
      • 結(jié)果
    • 求連續(xù)整數(shù)階乘的和
      • 說明
      • 放碼
      • 結(jié)果

驗(yàn)證性實(shí)驗(yàn)

求1~n的連續(xù)整數(shù)和

說明

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

對于相同的n,給出這兩種解法的求和結(jié)果和求解時(shí)間,并用相關(guān)數(shù)據(jù)進(jìn)行測試。

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

放碼

//文件名:exp1-1.cpp//求1+2+...+n #include <stdio.h> #include <time.h> // clock_t, clock, CLOCKS_PER_SEC #include <math.h>//方法1:老實(shí)累加 long add1(long n) {long i, sum = 0;for (i = 1; i <= n; i++)sum += i;return(sum); }void AddTime1(long n) /* 采用方法1的耗時(shí)統(tǒng)計(jì) */ {clock_t t = clock();long sum = add1(n);t = clock() - t;printf("方法1:\n");printf(" 結(jié)果:1~%d之和:%ld\n", n, sum);printf(" 用時(shí):%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的耗時(shí)統(tǒng)計(jì) */ {clock_t t = clock();long sum = add2(n);t = clock() - t;printf("方法2:\n");printf(" 結(jié)果:1~%d之和:%ld\n", n, sum);printf(" 用時(shí):%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); }

結(jié)果

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

常見算法時(shí)間函數(shù)的增長趨勢分析

說明

理解常見算法時(shí)間函數(shù)的增長情況。

對于1~n的每個(gè)整數(shù)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; }

結(jié)果

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 請按任意鍵繼續(xù). . .

設(shè)計(jì)性實(shí)驗(yàn)

求素?cái)?shù)個(gè)數(shù)

說明

通過對比同一問題不同解法的絕對執(zhí)行時(shí)間 ,體會如何設(shè)計(jì)“好”的算法。

求1~n的素?cái)?shù)個(gè)數(shù)。對于相同的n,給出這兩種解法的結(jié)果和求解時(shí)間,并用相關(guān)數(shù)據(jù)進(jì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:判斷正整數(shù)n是否為素?cái)?shù) {long i;for (i = 2; i < n; i++)if (n % i == 0)return false; //若n不是素?cái)?shù),則退出并返回falsereturn true; }void PrimeTime1(long n) //采用方法1的耗時(shí)統(tǒng)計(jì) {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(" 結(jié)果:2~%d的素?cái)?shù)個(gè)數(shù):%d\n", n, sum);printf(" 用時(shí):%lf秒\n", ((float)t) / CLOCKS_PER_SEC); }//------方法2----------------------------------------------- bool prime2(long n) //方法2:判斷正整數(shù)n是否為素?cái)?shù) {long i;for (i = 2; i <= (int)sqrt((double)n); i++)//對n開方進(jìn)行優(yōu)化if (n % i == 0)return false; //若n不是素?cái)?shù),則退出并返回falsereturn true; } void PrimeTime2(long n) //采用方法2的耗時(shí)統(tǒng)計(jì) {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(" 結(jié)果:2~%d的素?cái)?shù)個(gè)數(shù):%d\n", n, sum);printf(" 用時(shí):%lf秒\n", ((float)t) / CLOCKS_PER_SEC); }//------方法3----------------------------------------------- int countPrimes(long n) //方法3:埃拉托色尼篩選法,空間換時(shí)間,n不能過大,否則程序報(bào)錯(cuò) {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的耗時(shí)統(tǒng)計(jì) {long sum = 0;clock_t t = clock();sum = countPrimes(n);t = clock() - t;printf("方法3:\n");printf(" 結(jié)果:2~%d的素?cái)?shù)個(gè)數(shù):%d\n", n, sum);printf(" 用時(shí):%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; }

結(jié)果

n(取值范圍[10000, 40000]):40000 方法1:結(jié)果:2~40000的素?cái)?shù)個(gè)數(shù):4203用時(shí):0.236000秒 方法2:結(jié)果:2~40000的素?cái)?shù)個(gè)數(shù):4203用時(shí):0.009000秒 方法3:結(jié)果:2~40000的素?cái)?shù)個(gè)數(shù):4203用時(shí):0.001000秒 請按任意鍵繼續(xù). . .

求連續(xù)整數(shù)階乘的和

說明

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

放碼

//文件名:exp1-4.cpp #include <stdio.h>//循環(huán)版 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; }

結(jié)果

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

總結(jié)

以上是生活随笔為你收集整理的《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。