C語言必備基礎題

引入常用頭文件
# include <stdio.h>     // 輸入輸出庫
# include <math.h>      // 數學庫
# include <string.h>    // 字符串處理庫
1.判斷閏年

滿足以下2個條件之一即爲閏年:1.被4整除且不能被100整除(普通閏年); 2.能被400整除(世紀閏年)

int main()          // 求1900-2000年之間的閏年
{
 int i;
 printf("閏年是");
 for(i=1900;i<=2000;i++)
 {
     if(i%4==0 && i%100!=0 || i%400==0)
     {
         printf("%d年\n",i);
     }
 }
 return 0;
}
2.二次方程求根
int main()
{
 double a,b,c,d,x1,x2,realpart,imagpart;
 scanf("%lf %lf %lf",&a,&b,&c);
 printf("The equation ");
 if(a==0)         //實數與0比較可能不精確,可改爲(fabs(a)<=1e-6)
    printf("is not a quadratic.\n");  //不是二次方程
 else
 {
     d=b*b-4*a*c;                      //判別式
     if(d==0)                          //相等實根是-b/(2a)
        printf("has 2 equal roots: %.4lf\n",-b/(2*a));  
     else if(d>0)                     //(fabs(d)>1e-6)
     {
  	x1=(-b+sqrt(d))/(2*a);
   	x2=(-b-sqrt(d))/(2*a);
   	printf("has distinct real roots: %.4lf and %.4lf\n",x1,x2);
     }
     else                           //d<0,有兩個復根
     {                    //兩個複數根爲:實部+-虛部i
      realpart=-b/(2*a);               //復根實部
      imagpart=sqrt(-d)/(2*a);         //復根虛部
      printf("has complex roots:\n");
      printf("%.4lf+%.4lfi\n",realpart,imagpart);           
      printf("%.4lf-%.4lfi\n",realpart,imagpart);
      }
 }
 return 0;
}
3.判斷素數
3.1 普通法

素數:一個數除了被1和自身整除,不能被其他任何數整除。
1不是素數。

int main()
{
 int i,j,k,m=0;                //m爲計數變量
 for(i=101;i<=200;i+=2)        //偶數一定不是素數
 {
  k=sqrt(i);
  for(j=2;j<=k;j++)            //判斷一個數是不是素數
  {
   if(i%j==0) break;
  }
  if(j>k)  
  {
   printf("%d ",i);
   m++;
  }
  if(m%10==0) printf("\n");    //每隔10個換行
 }
 printf("\n");
 return 0;
}
3.2 篩選法

Eratosthenes篩法:一個整數數組,把非素數和其倍數挖掉,剩下的爲素數。
算法:1.把1挖掉
2.用下一個未被挖去的數p去除p後面各數,把p的倍數挖去
3.當p<sqrt(n)時循環

# define N 1000
int main()
{
 int a[N+1]={0},i,j,k=sqrt(N+1),count=0;
 // 給數組賦值
 for(i=2;i<=N;i++)
 {
  a[i]=i;
 }
 // 篩選
 for(i=2;i<k;i++)
 {
  for(j=i+1;j<=N;j++)
  {
   if(a[j]!=0 && a[i]!=0)
   {
    if(a[j]%a[i]==0)
    {
     a[j]=0;
    }  
   }
  }
 }
 // 輸出素數
 for(i=1;i<=N;i++)
 {
  if(a[i]!=0)
  {
   printf("%5d",a[i]);
   count++;
   if(count%10==0)
   {
    printf("\n");
   }
  }  
 }
 printf("\n");
 return 0;
}
4.求最大公約數

輾轉相除法(歐幾里得算法):較大數/較小數->餘數, 較小數/餘數->餘數2,不斷迭代,直至餘數爲0,此時的除數就是最大公約數。
依據原理:gcd(a,b)=gcd(b,a mod b)
*兩個數的最小公倍數=這兩個數的乘積/其最大公約數

int gcd(int a,int b)  // 求最大公約數
{
 int temp,r;
 // 兩數交換,使得a爲較大數
 if(a<b)
 {
  temp=a;a=b;b=temp;
 }
 // 迭代
 for(r=a%b;r!=0;)
 {
  a=b;
  b=r;
  r=a%b;
 }
 return b;
}
 int main()
{
 int a,b,x,y;
 char c;
 while(1)
 {
  printf("請輸入兩個數:");
  scanf("%d %d",&a,&b);
  x=gcd(a,b);
  y=a*b/x;
  printf("%d與%d的最大公約數是%d,最小公倍數是%d\n",a,b,x,y);
  printf("continue or not?(y/n):");
  scanf(" %c",&c);   // 當getchar()獲得控制字符擾亂程序時,可以使用scanf(" %c",&c)獲得一個可見字符,記得格式前面加空格
  if(c=='n')
   break;
 } 
 return 0;
}
5.楊輝三角形

每個元素是其兩肩元素之和

# define N 9       // 9階
int main()
{
 int a[N][N]={0},i,j;
 for(i=0;i<N;i++)
 {  // 第一列和對角線元素爲 1
  a[i][i]=1;
  a[i][0]=1;
  for(j=0;j<N;j++)
  {
   if(i>1 && j>0)
   {
    a[i][j]=a[i-1][j]+a[i-1][j-1];   // key
   }
   if(i>=j) printf("%d ",a[i][j]);
   else printf(" ");
  }
  printf("\n"); 
 }
 return 0;
}
6.重排數組

產生30個[1,100]中的隨機整數到5*6數組中,求其中最大值與最小值,並將最大值與右上角元素對調,最小值與左下角元素對調。

# include <stdlib.h>   // 使用rand()函數產生隨機數
# include <time.h>     // 設定隨機數種子爲當前時間
int main()
{
 int a[5][6],i,j,*max,*min,temp;
 max=&a[0][0];
 min=&a[0][0];
 printf("原始數組爲:\n");
 srand((unsigned int)time(NULL)); // 以當前時間作爲種子
for(i=0;i<5;i++)
 {
  for(j=0;j<6;j++)
  {
   a[i][j]=rand()%100+1;   // 生成[1,100]隨機數
   // 生成[a,b]之間隨機數:rand()%(b-a+1)+a
   printf("%4d",a[i][j]);
  }
  printf("\n");
 }
 for(i=0;i<5;i++)
 {
  for(j=0;j<6;j++)
  {
   if(a[i][j]>*max)
    max=&a[i][j];       // 指針指向最大值
   else if(a[i][j]<*min)
    min=&a[i][j];       // 指針指向最小值
  }
 }
 // 交換最大值與右上角元素
temp=*max;
 *max=a[0][5];
 a[0][5]=temp;
 // 交換最小值與左下角元素
 temp=*min;
 *min=a[4][0];
 a[4][0]=temp;
 // 輸出數組
 printf("\n重排後的數組爲:\n");
 for(i=0;i<5;i++)
 {
  for(j=0;j<6;j++)
  {
   printf("%4d",a[i][j]);
  }
  printf("\n");
 }
}
7.n階螺旋方陣

每一圈爲最外層循環,每一圈中四個方向是四個小循環。

int main()
{
 int i,j,k,n,num=1;
 int a[10][10]={0};
 printf("請輸入階數n:");
 scanf("%d",&n);
for(k=0;k<=n/2;k++)    // 大循環控制幾圈
 {
  
  for(i=k;i<n-k;i++)
  {
   if(a[k][i]==0)
    a[k][i]=num++;
  }
  for(i=k;i<n-k;i++)
  {
   if(a[i][n-k-1]==0)
    a[i][n-k-1]=num++;
  }
  for(i=n-k-1;i>=k;i--)
  {
   if(a[n-k-1][i]==0)
    a[n-k-1][i]=num++;
  }
  for(i=n-k-1;i>=k;i--)
  {
   if(a[i][k]==0)
    a[i][k]=num++;
  }
 }
for(i=0;i<n;i++)   // 輸出數組
 {
  for(j=0;j<n;j++)
  {
   printf("%4d",a[i][j]);
  }
  printf("\n");
 }
 return 0;
}
8.分解質因數

將整數分解成素數的連乘積,如90=2*3 *3 *5.

int isPrime(int a)    // 判斷是否爲素數
{
 int i;
 for(i=2;i<=sqrt(a);i++)
 {
  if(a%i==0)
  {
   return 0;
  }
 }
 return 1;
}

int main()
{
 int a,b,i,j=0;
 printf("請輸入一個整數:");
 scanf("%d",&a);
 b=a;
 printf("%d=",a);
 for(i=2;i<a/2;i++)
 {
  while(b%i==0 && isPrime(i))
  {
   printf("%d*",i);
   b/=i;
  }
  if(b==1)
   break;
 } 
 printf("\b");
 //printf("\n");
 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章