在學C語言的人,怎能不了解這些經典算法問題?

2020-12-12 騰訊網

C語言中有有許多經典的算法,這些算法都是許多人的智慧結晶,也是編程中常用的算法,這裡面包含了眾多算法思想,掌握這些算法,對於學習更高級的、更難的算法都會有很大的幫助,會為自己的算法學習打下堅實的基礎。

一、古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?(兔子的規律為數列1,1,2,3,5,8,13,21....)這也是著名的斐波那契數列。

//斐波那契數列

void Fabocci()

{

long int f1,f2;

f1 = f2 = 1;

int i;

for(i = 1; i

{

printf("%12ld %12ld ",f1,f2);

if(i % 2 == 0) //控制輸出,每行輸出4個

printf("\n");

f1 = f1+f2; //後一個數是前兩個數的和

f2 = f1+f2; //後一個數是前兩個數的和

}

}

二、1-100之間有多少個素數,並輸出所有素數及素數的個數。程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。

//輸出1-100的所有素數

void Prime()

{

int i,j,flag,n;

n = 100; //100以內的素數

flag = 1; //標識變量,是素數則為1

for(i = 2; i

{

flag = 1;

for(j = 2; j*j

{

if(i % j == 0)

{

flag = 0;

break;

}

}

if(flag == 1)

printf("%d ",i); //輸出素數

}

}

三、一個數如果恰好等於它的因子之和,這個數就稱為「完數」。例如6 = 1+2+3找出10000以內的所有完數。

//找出1000以內的所有完數(一個數等於其因子之和)

void PerfectNumber()

{

int p[80]; //保存分解的因子

int i,num,count,s,c = 0;

int MaxNum = 10000;

for(num = 2; num

{

count = 0;

s = num;

for(i = 1; i

{

if(num % i == 0) //能被i整除

{

p[count++] = i; //保存因子,讓計數器count增加1

s -= i; //減去一個因子

}

}

if( 0 == s)

{

printf("%4d是一個完數,因子是:",num);

printf("%d = %d",num,p[0]); //輸出完數

for(i = 1; i

printf("+%d",p[i]);

printf("\n");

c++;

}

}

printf("\n共找到%d個完數。\n",c);

}

四、輸出9*9乘法口訣。

//9*9乘法口訣表

void Table99()

{

int i,j;

for(i = 1; i

{

for(j = 1; j

{

printf("%d*%d=%-4d",i,j,i*j);

}

printf("\n");

}

}

五、編程列印楊輝三角

//列印楊輝三角

void YangHuiTriangle()

{

int i,j,triangle[8][8];

for(i = 0; i

for(j = 0; j

triangle[i][j] = 1;

for(i = 2; i

{

for(j = 1; j

{

triangle[i][j] = triangle[i-1][j]+triangle[i-1][j-1];

}

}

for(i = 0; i

{

for(j = 0; j

printf("%-4d",triangle[i][j]);

printf("\n");

}

}

六、下面程序的功能是將一個4×4的數組進行逆時針旋轉90度後輸出,要求原始數組的數據隨機輸入,新數組以4行4列的方式輸出。

void Array4_4()

{

int A[4][4],B[4][4],i,j;

printf("Please Input 16 numbers:");

for(i = 0; i

for(j = 0; j

{

scanf("%d",&A[i][j]); //輸入16個數

B[3-j][i] = A[i][j]; //旋轉90度賦值

}

printf("Array A:\n"); //輸出矩陣A

for( i = 0; i

{

for(j = 0 ; j

{

printf("%4d",A[i][j]);

}

printf("\n");

}

printf("Array B:\n"); //輸出矩陣B

for( i = 0; i

{

for(j = 0 ; j

{

printf("%4d",B[i][j]);

}

printf("\n");

}

}

七、實現將輸入的字符串反序輸出。

/*實現字符串翻轉*/

char* reverse_str(char* str)

{

if(NULL == str) //字符串為空直接返回

{

return str;

}

char *begin;

char *end;

begin = end = str;

while(*end != '\0') //end指向字符串的末尾

{

end++;

}

--end;

char temp;

while(begin

{

temp = *begin;

*begin = *end;

*end = temp;

begin++;

end--;

}

return str; //返回結果

}

八、輸入一個字符串,判斷其是否為回文。回文字符串是指從左到右讀和從右到左讀完全相同的字符串。

//判斷一個字符串是否是回文

void IsHuiWen()

{

char str[100];

int i,j,n;

printf("請輸入一段字符串:");

gets(str);

n = strlen(str);

for(i = 0,j = n-1; i

if(str[i] != str[j])

break;

if(i >= j)

printf("是回文!\n");

else

printf("不是回文!\n");

}

九、求近似Pi值。可以用公式(如:pi/2 = 1+1/3+1/3*2/5 + 1/3*2/5*3/7 + 1/3*2/5*3/7*4/9+.....)

void Pi()

{

double pi = 2,temp = 2; //初始化pi值和臨時值

int numerator = 1,denominator = 3; //初始化分子和分母

while(temp > 1e-16) //數列大於指定精度

{

temp = temp*numerator/denominator;//計算一個數列的值

pi += temp;

numerator++;

denominator += 2;

}

printf("PI = %.18f\n",pi);

}

十、實現字符串拷貝函數strcopy(char*src,char* dest)

void strcopy(char *str, char *dest)

{

while(*str != '\0')

{

*dest++ = *str++;

}

*dest = '\0';

}

以上就是我的分享,有什麼問題歡迎大家評論區留言。

相關焦點

  • C語言?c+?到底先學哪個才能更好的理解編程,這些你造嗎
    最近大一新生們剛剛結束第一個學期的學習,接踵而來的問題也越來越多,不同的學校有不同的學習節奏,但是基本上都是從C語言或者c++開始學起。現在越來越多的人對於「學習C語言還有必要嗎?」這件事比較糾結。
  • C語言你學「廢」了嗎?
    大一學計算機,一上來編程老師為了提起我們對計算機編程的興趣,先來一遍「Hello word」。然後你慢慢的進入老師的節奏,初識C語言 / 了解C語言的發展史,搭建C開發環境認識一個簡單的C程序 / 一般都從「Helloworld"這個簡單的C程序開始算法入門 / 算法基本概念,簡單程序結構
  • 教你輕鬆學習C語言系列之——從「Hello World」開始夢想起航
    看到密密麻麻的代碼,對於很多初學者來說,即覺得好玩又新奇,但同時也在不停地問自己:「我能學得會嗎?」其實編程難也不難。說它難,是因為隨著學習的深入,抽象的概念、交叉的學科、複雜的問題交織在一起,對學習者的邏輯思維確實是一項挑戰;說它不難,對於喜歡編程、想要學習編程的愛好者來說,其實也很容易上手。
  • 學C語言還是學C+好?兩者有什麼區別?需要什麼開發環境?
    所以它們也可以廣義稱為C語言。 但是它們的程序設計哲學卻差別很大,C是問題來適應語言;C++是語言適應問題;所以也可以說是兩種語言。 至於先學C還是先學C++,專家也意見不一,主要是因為:相對打基礎來說,彙編無疑是重要的,但 畢竟太生澀,所以C是最好的選擇,而且不論何種語言,算法仍然是核心,而C最適合培養算法素養。
  • C語言的幾個入門階段
    C語言,在大學裡普遍被當作第一門程式語言,用於編程入門,以及數據結構和算法的教學。雖然比C++要容易點,但因為指針的存在,C其實就是個高級的彙編:(並不是很好學,尤其是它的壓軸章節:指針。說明會使用二分法和遞歸,初步理解了數組的名字、首地址和指針的關係,初步了解了算法的時間複雜度。3,會寫二叉樹。能夠把一堆亂序的數字添加到二叉樹,然後遍歷出來時是有序的,即排序二叉樹。
  • 想學編程?先來理解一下C語言的Helloworld程序吧
    C語言作為一門計算機科學歷史上裡程碑式的程式語言,現在依然被廣泛使用。其功能強大,內容簡單,想學習編程的小夥伴們不妨先學習一下C語言。本文將介紹一下K&R所寫的經典程序:Helloworld的簡要分析。
  • 淺談信息學奧賽程序設計算法的教學
    【摘 要】青少年信息學奧林匹克競賽作為一項面向青少年普及計算機科學知識的競賽活動,主要是培養和提高青少年的思維能力、分析判斷能力和應用計算機解決問題的能力。信息學奧賽教學的最終目標就是讓學生從給定的問題出發,設計解決問題的算法,並能初步使用一種程序設計語言編製程序實現算法解決問題。本文談談我近幾年來在信息學奧賽程序設計算法教學中採取的一些方法和策略。
  • c語言和PHP,學哪個好?
    計科專業從事嵌入式開發多年,從現在的市場行情以及就業的機會上講php的就業空間還是大於C語言,但並不意味著C語言就已經被淘汰掉了,相反因為高級語言在應用領域使用的範圍比較廣泛,倒是顯得很多底層的程式語言成了稀缺的物種,畢竟對於底層的維護也是一項很重要的工作,況且C語言的使用範圍並不是很狹窄
  • C語言編寫程序求水仙花數
    C語言編寫程序求水仙花數水仙花數是一個數學問題,其實質是一個三位數,個位數的立方加十位數的立方加百位數的立方之和等於這個三位數本身。例如153=1*1*1+5*5*5+3*3*3,即153=1+125+27。
  • 開課吧:C++/C語言相關崗位介紹!什麼樣的人適合學C?
    什麼樣的人適合學C/C++?想做C++算法者對算法感興趣,卻不知道如何入門,課程會有針對性地進行算法強化挑戰技術拿高薪者C/C++是所有其他語言的基石,學會技術的根和術,擁有核心競爭力、高級職位:嵌入式系統開發工程師智能設備軟體中級職位:軟體工程師高級職位:系統工程師、系統架構師智慧機器人中級職位:ROS系統工程師、機器人算法工程師高級職位:導航算法工程師、定位算法工程師
  • 回溯算法解決八皇后問題(包含C語言實現代碼)
    八皇后問題是以西洋棋為背景的問題:有八個皇后(可以當成八個棋子),如何在 8*8 的棋盤中放置八個皇后,使得任意兩個皇后都不在同一條橫線、縱線或者斜線上
  • 資料| 《(中文版)數據結構與算法分析:C 語言描述》
    資料 | 《(中文版)數據結構與算法分析:C 語言描述》
  • MIT 推出機器翻譯新算法,破譯已消失的古語言
    官方指出,該系統能夠自動破譯已消失的語言,且無需對這一語言與其他語言的關係有深入的了解。他們還表明,該系統自身就可以確定語言之間的關係,並可以用它來證實最近的一項表明 Iberian 語言實際上與 Basque 語言無關的學術研究。
  • 用C語言編寫屬於自己的程式語言,大一學完C語言即可做!
    首先,明確一點,咱這個項目只是做一個簡單的腳本語言而不是編譯型語言!!!其次,本文不需要太多專業知識,所以不慌。最後,本文只是簡單實現腳本語言,雖然不牛X......實驗環境 : linux2.知識點 : 大一所學 C語言 知識二 要做功能:1.實現語法分析列印 hello-world
  • python與c語言的語法有哪些不一樣的
    在眾多程式語言之中,想必很多人都聽說過Python和C語言,在進行編程學習之前,大家都會問:python和c語言的區別有哪些?我該如何選擇?接下來我們來看看吧。4、速度:Python程式語言因為歷史原因,有一個GIL鎖,導致其對多線程支持不夠好,運行速度較慢;C語言比較快,是比較底層的語言,運行效率優於Python。5、複雜度:在Python中,不需要聲明變量類型,而在C中,必須聲明變量類型;Python程序更易於學習、編寫和閱讀,C程序語法比Python難。
  • C語言中「c=a+b」,這種結構合理嗎?
    int a = 5, b = 7, c; c = a+++b; 這個代碼確實不咋符合習慣的寫法,但是不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?
  • C語言怎麼樣?今天聊聊C語言的發展史!
    賈伯斯的貢獻在於,他如此了解用戶的需求和渴求,以至於創造出了讓當代人樂不思蜀的科技產品。然而,卻是裡奇先生為這些產品提供了最核心的部件,人們看不到這些部件,卻每天都在使用著。" 2. C語言的先輩 2.1BCPL語言之父
  • 拓撲排序算法及C語言實現
    拓撲排序算法的實現過程對有向無環圖進行拓撲排序,只需要遵循兩個原則:在圖中選擇一個沒有前驅的頂點 V;從圖中刪除頂點 V 和所有以該頂點為尾的弧。例如,在對圖 1 中的左圖進行拓撲排序時的步驟如圖 2 所示:
  • C 語言,你真的懂遞歸了嗎?
    要說到遞歸如果不說棧的話,我覺得有點不合適,遞歸特點就是不斷的調用同一個函數,如果這個函數沒有一個遞歸界限,那麼就是死循環了,所以討論遞歸,就必須要討論遞歸的界限,就是限定這個遞歸調用多少次。我們上面說到了,既然遞歸使用了棧,那麼系統的棧的大小肯定是有極限的,不可能系統給你分配無極限的棧的大小,我看一些文章說棧大小是64K。還是上面那個例子,我把傳入數據設置為很大執行看看。
  • 你已經是個成熟的985大學了,請不要在大一教 C 語言!
    我在那篇文章中說 C 語言是最適合用來理解計算機系統底層機制的語言,那今天就詳細說說,這些底層機制都有哪些:內存一名合格的程式設計師必須了解內存,學習 C 語言是了解內存布局最直接、有效的途徑,大家可以看到之前講解指針那篇文章