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';
}
以上就是我的分享,有什麼問題歡迎大家評論區留言。