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

C語言中有有許多經典的算法,這些算法都是許多人的智慧結晶,也是編程中經常使用的算法,這裏麪包含了衆多算法思想,掌握這些算法,對於學習更高級的、更難的算法都會有很大的幫助,會爲本身的算法學習打下堅實的基礎。c++


 

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

//斐波那契數列算法

void Fabocci()編程

{數組

long int f1,f2;編程語言

f1 = f2 = 1;函數

int i;學習

for(i = 1; i <= 20; i++)ui

{spa

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

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

printf("\n");

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

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

}

}

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

//輸出1-100的全部素數

void Prime()

{

int i,j,flag,n;

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

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

for(i = 2; i <= 100; i++)  //從2開始,遍歷到100

{

flag = 1;

for(j = 2; j*j <= i; j++) //能被2 - sqrt(i)整除的數

{

if(i % j == 0)

{

flag = 0;

break;

}

}

if(flag == 1)

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

}

}

3、一個數若是剛好等於它的因子之和,這個數就稱爲「完數」。例如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 < MaxNum; num++)

{

count = 0;

s = num;

for(i = 1; i < num/2+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 < count; i++)

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

printf("\n");

c++;

}

}

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

}

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

//9*9乘法口訣表

void Table99()

{

int i,j;

for(i = 1; i <= 9; i++)    //外層循環控制行

{

for(j = 1; j <= i; j++) //內層循環控制列

{

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

}

printf("\n");

}

}

5、編程打印楊輝三角

//打印楊輝三角

void YangHuiTriangle()

{

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

for(i = 0; i < 8; i++)

for(j = 0; j < 8; j++)

triangle[i][j] = 1;

for(i = 2; i < 8; i++)

{

for(j = 1; j < i; j++)

{

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

}

}

for(i = 0; i < 8; i++)

{

for(j = 0; j <= i; j++)

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

printf("\n");

}

}

6、下面程序的功能是將一個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 < 4; i++)

for(j = 0; j < 4; j++)

{

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

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

}

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

for( i = 0; i < 4; i++)

{

for(j = 0 ; j < 4; j++)

{

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

}

printf("\n");

}

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

for( i = 0; i < 4; i++)

{

for(j = 0 ; j < 4; j++)

{

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

}

printf("\n");

}

}

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

/*實現字符串翻轉*/

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 < end) //交換兩個字符

{

temp = *begin;

*begin = *end;

*end = temp;

begin++;

end--;

}

return str; //返回結果

}

8、輸入一個字符串,判斷其是否爲迴文。迴文字符串是指從左到右讀和從右到左讀徹底相同的字符串。

//判斷一個字符串是不是迴文

void IsHuiWen()

{

char str[100];

int i,j,n;

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

gets(str);

n = strlen(str);

for(i = 0,j = n-1; i < j; i++,j--)

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

break;

if(i >= j)

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

else

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

}

9、求近似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);

}

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

void strcopy(char *str, char *dest)

{

while(*str != '\0')

{

*dest++ = *str++;

}

*dest = '\0';

}

以上就是個人分享,有什麼問題歡迎你們評論區留言。


 

最後,若是你也想成爲程序員,想要快速掌握編程,趕忙加入學習企鵝圈子!

裏面有資深專業軟件開發工程師,在線解答你的全部疑惑~編程語言入門「so easy」

編程學習書籍:


 

編程學習視頻:

相關文章
相關標籤/搜索