C语言的一些算法


/* Note:Your choice is C IDE */1
#include   "stdio.h"
int   diGuiSum( int   num);
void   main()
{
 
  // 用递归求   100 内的和
 printf( "%d" ,diGuiSum(100));
  
}

int   diGuiSum( int   num) {
         if (num   == 1)
               return   1;
         return   num   + diGuiSum(num   - 1);  //100的和等于99的和+100,依次类推。
}



/* Note:Your choice is C IDE */2
#include   "stdio.h"
#include   "string.h"
#define   N 50

void   main()
{
       char   a[N];
         int   i,start   = 0;
         int   end   = 0,k;
         char   t;
     printf(   " 请输入一串字符 " );
     gets(a);
     k = strlen(a);
     end = k - 1;
       while (start   <= end)   // 颠倒整个字符串
       {  
      t   = a[start];
      a[start]   = a[end];
      a[end]   = t;
      start   ++ ;
      end   -- ;      
       }
     printf(   " 颠倒后的字符串是: %s" ,a);
   
      start   = 0;
        for (i   = 0;i   < k;i   ++   // 颠倒一个单词
        {      
                     if (a[i]   == 32   || a[i+1]   == 0)    // 如果是空格   或是结尾
                     {
                           if (i   == k   - 1)    // 判断是否最后一个
                           end   = i;
                           else
                          end   = i   - 1;
                           while (start   <= end)    // 调换空格与空格之间
                           {
                        t   = a[start];
                        a[start]   = a[end];
                        a[end]   = t;
                        start   ++ ;
                        end   -- ;      
                           }
                        start   = i   + 1;   // 起始位置
                     }      
        }
     
     printf(   "\n 输出: "   );
       for (i   = 0;i   < k;i   ++ )
       {
      printf(   "%c" ,a[i]);
       }
    
}





/* Note:Your choice is C IDE */3
#include   "stdio.h"
#define   StoreLen 20   //   仓库数组的最大长度
#define   CarLen 10   //   购物车数组的最大长度

/* 超市购物车 */
struct   product
{
         int   id;   // 商品编号
         char   name[50];   // 商品名
         double   price;   // 商品价格
         int   storeCount;   // 数量
         double   sumPrice;   // 单种商品的总价
} ;
typedef   struct   product goods;   // 给这个结构体类型取别名


/*------------------- 初始化函数 --------------------*/
int   store(goods p[]);                                       // 进货
void   shopCar(goods p[], int   goodsLen, int   pid, int   pcount);    // 购物
void   showProduct(goods p[], int   len, int   storeORcar);         // 显示信息

goods myCar[CarLen];   // 准备购物车
int   carLength =   0;       // 购物车一开始为空

/*------------------- 主函数入口 --------------------*/
void   main()
{
      goods  p[StoreLen];       // 定义仓库商品数组
         int   flag;                 // 是否继续购买
         int   pid;                         // 购买商品编号
         int   pcount;                      // 购买商品数量
      
      int   goodsLen   = store(p);     // 进货完成,返回仓库目前存了几种商品(目前数组大小)
    printf( "---------- 亲爱的顾客,本店有以下商品   --------\n" );
    showProduct(p,goodsLen,1);   //1 表示进   : 显示进货信息
  
      while (1)   
      {
          printf(   " 请输入购买的商品编号,数量   :\n" );
          scanf(   "%d %d" , &   pid, &   pcount);
          shopCar(p,goodsLen,pid,pcount);    // 添加到购物车
          printf(   " 是否继续购买? :1( 继续   )/0( 退出 )\n"   );
          scanf(   "%d" , &   flag);
            if (flag   == 0)
              break ;
      }
    printf( "---------- 亲爱的顾客,你购买的商品信息如下:   ----------\n" );
    showProduct(myCar,carLength,   - 1);    //-1 表示出 :   显示购物车信息
   
   
    printf( "\n---------- 购买后超市商品信息如下:   ----------\n" );
    showProduct(p,goodsLen,1);    //-1 表示出 :   显示购物车信息
}

  /*-------------------- 进货哦   ---------------------*/
int   store(goods p[])
{
         int   flag;      // 是否继续进货
         int   nowNum   = 0;   // 目前的库存种类
      
         while (1)   
         {
           if (nowNum   < StoreLen)    // 判断是否超过库存的最大存储量
           {
         printf(   " 请输入编号,商品名,单价,进货数量:   \n" );
         scanf(   "%d %s %lf %d" , & p[nowNum]   . id,   & p[nowNum]   . name,   & p[nowNum]   . price,   & p[nowNum]   . storeCount);
         nowNum   += 1;           // 每次存储完,数组大小增加   1
         printf(   " 是否继续进货? :1( 继续   )/0( 退出 )\n"   );
         scanf(   "%d" , &   flag);
              if (flag   == 0)
                break ;
           }
           else
           {
             printf(   " 很抱歉!仓库已经满了,不能再进货了!   \n" );
             break ;
           }   
         }
     return   nowNum;    // 返回数组大小
 
}

/*------------- 顾客购买 -----------------------*/
void   shopCar(goods p[], int   goodsLen, int   pid, int   pcount)   //   参数:目前库存的商品,购买的商品编号、购买的商品数量
{
     int   i;
     int   index   =- 1;
     int   carflag   = 0;   // 购物车中有没有已经购买的商品
     for (i   = 0;i   < goodsLen;i   ++   // 找超市里的商品是否有我输入的编号商品
     {
         if (p[i]   . id   == pid)
         {
            index   = i;
               break   // 找到就不再往后循环查找了
         }
     }
  
     if (index   >= 0)    // 找到了
     {
          if (pcount   < p[index]   . storeCount)   // 判断购买的数量是否大于该商品的库存量
          {
             // 查找购物车是否有存在的商品
                 for (i   = 0;i   < carLength;i   ++ )
                 {
                      if (myCar[i]   . id   == pid)    // 如果存在,只要更改数量即可
                      {
                         myCar[i]   . storeCount   += pcount;   // 购物车数量加
                         p[index]   . storeCount   -= pcount;   // 商品架的数量减
                         myCar[i] . sumPrice =   myCar[i] .   storeCount *   myCar[i] .   price;
                       carflag   = 1;
                         break ;
                      }
                 }
                    
                 if (carflag   != 1)    // 如果购物车不存在要购买的商品
                 {
                  myCar[carLength]   = p[index];    // 往购物车中添加
                  myCar[carLength]   . storeCount   = pcount;    // 设置购买数量
                  myCar[carLength] . sumPrice =   myCar[carLength] . storeCount   * myCar[carLength]   . price;
                  p[index]   . storeCount   -= pcount;   // 所购买的对应的超市商品数量要减
                  carLength   ++   // 长度加   1
                 }                           
          }
          else
          {
          printf(   " 该商品库存不足! \n" );   
          }
     }
     else
     {
       printf(   " 编号错误 !   没有该商品 .\n" );
     }   
}

/*------------------ 显示信息 ----------------------*/
void   showProduct(goods p[], int   len, int   storeORcar)
{
    int   i;
    if (storeORcar   == 1)
    {
      printf(   " 编号: \t   商品名: \t 单价:   \t\t   数量: \t\n"   );   
         for (i   = 0;i   < len;i   ++ )
         {
      printf(   "%d\t %s\t\t %.2lf\t\t %d\t \n" ,p[i] . id,p[i]   . name,p[i]   . price,p[i]   . storeCount);
         }
    }
    else   if (storeORcar   ==- 1)
    {
      printf(   " 编号: \t   商品名: \t 单价:   \t\t   数量: \t   总价: \t\n" );      
         for (i   = 0;i   < len;i   ++ )
         {
      printf(   "%d\t %s\t\t %.2lf\t\t %d\t %.2lf \n" ,p[i] . id,p[i]   . name,p[i]   . price,p[i]   . storeCount,p[i]   . sumPrice);
         }
    }
}









#include   "stdio.h"   //4
void   main()
{
       
         int   year, month;
         int   sumYearDays   =   0;    // 该变量是统计到现在的总年数天数
         int   sumMonthDays   =   0;   // 月份总天数
         int   sumDays   =   0;   // 总天数
         int   week;   // 星期
         int   y, i;
         int   monthArr[]   =   { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31   }   //12 个月的天数
          
      printf(   " 请输入一个日期 (2013-10):" );
      scanf(   "%d-%d-%d" ,   &   year,   &   month);    //   -   -
         
         // 思路   : 1900 1   1 日是星期一

         for (y   =   1900; y   <   year; y   ++ )
         {
           if (y   %   400   ==   0   ||   (y   %   4   ==   0   &&   y   %   100   !=   0))   {
               sumYearDays   +=   366;       // 闰年     366
           }
           else
               sumYearDays   +=   365;   // 平年     365
         }
        

         // 闰年的二月份
         if (year   %   400   ==   0   ||   (year   %   4   ==   0   &&   year   %   100   !=   0) )   {
         monthArr[1]   =   29;
         }
      
         // 累加今年的月份天数
         for (i   = 0; i   <   month   - 1; i   ++ )   {
            sumMonthDays   +=   monthArr[i];
         }
      
      sumDays   =   sumYearDays   +   sumMonthDays   +   1;    // 总天数   =   年得总天数   + 月、号得总天数
      
         // 求本月的第一天是星期几   余数
      week   =   sumDays   %   7;
      
      printf(   " 星期日 \t   星期一 \t 星期二   \t 星期三   \t 星期四   \t 星期五   \t 星期六   \n" ); 
      
         for (i   =   0; i   <   week; i   ++ )
         {
              printf(   "\t" );
         }
      
         for (i   =   1; i   <=   monthArr[month - 1]; i   ++ )
         {
            printf(   "%d\t"   , i);
               if ((i   +   week)   %   7   ==   0)
                  printf(   "\n" );
         }
      
       
       
}










/* Note:Your choice is C IDE */5
#include   "stdio.h"
void   main()
{
      int   i,j;
      int   row   = 10;   // 要显示多少行
      for (i   = 1;i   <= row;i   ++ )   {
         for (j   = 1;j   <= row   - i;j   ++ )   {
            printf(   " " );
         }
      
         for (j   = 1;j   <= 2   * i   - 1;j   ++ )   {
            printf(   "*" );
         }
      printf(   "\n" );
      }
   
}

/*

等腰直角三角型:填充式

&&&*
&&***
&*****
*******

*/










/* Note:Your choice is C IDE */6
#include   "stdio.h"
void   main()
{
         int   i,j,row   = 10;
         int   col   = 2   * row   - 1;
         for (i   = 1;i   <= row;i   ++ )   {
               for (j   = 1;j   <= col;j   ++ )   {
                     if (j   <= row   - i   || j   > col   - (row   - i))
                        printf(   " " );
                     else
                        printf(   "*" );
               }
            printf(   "\n" );
         }
   
}

/*

等腰直角三角型:填充式

&&&*&&&
&&***&&
&*****&
*******

*/




/* Note:Your choice is C IDE */7
#include   "stdio.h"
long   jieCheng( int   num);

void   main()
{
        //   求任意一个数的阶乘,但是不能求大数据,将结果输出。
     
      printf(   "%d" ,jieCheng(19));
     
}

long   jieCheng( int   num) {
         if (num   == 1)
               return   1;
         return   num   * jieCheng(num   - 1);
}




/* Note:Your choice is C IDE */8
#include   "stdio.h"
int   peach( int   n)
{
    if (n == 1)
    return   1;
    else
    return   (peach(n   - 1)   + 1)   * 2;   
}
void   main()
{
    //    猴子吃桃:一只猴子摘了一堆桃子,它每天吃了其中的一半然后再多吃一个,
     //   直到第   10 天,它发现只有   1 个桃子了,问:它第一天摘了多少个桃子?

      int   days;
      int   sum   = 0;
    printf( " 请输入天数   " ); 
    scanf( "%d" ,   & days);
    sum = peach(days);
  printf( "\n 最初的桃子数   %d" ,sum);  
}





/* Note:Your choice is C IDE */9
#include   "stdio.h"
#include   "string.h"
void   main()
{
         char   a[20];
         int   i,j,k;
      printf(   " 请输入数字 "   );
      gets(a);
      k   = strlen(a);
         for (i   = 0,j   = k   - 1;i   < j;i   ++ ,j   -- )
         {
          if (a[i]   != a[j])
          break ;
         }
          if (i   >= j)
          {
        printf(   " 是回文数 "   );
          }
          else
          {
        printf(   " 不是回文数 "   ); 
          }  
}





/* Note:Your choice is C IDE */10
#include   "stdio.h"
int   isSuShu( int   number);

void   main()
{
         // 所有素数的和
         int   num;
      for (num   = 1;num   <= 1000;num   ++ )   {
 
         if (isSuShu(num))   {
            printf(   "%d\n" ,num);
         }
      }
}

int   isSuShu( int   number) {
      
         int   flag   = 1,i;
         for (i   = 2;i   < number;i   ++ )   {
               if (number   % i   == 0)   {
                  flag   = 0;
                     break ;
               }
         }
         return   flag;
}





/* Note:Your choice is C IDE */11
#include   "stdio.h"
void   main()
{
         // 打印九九乘法表
      
         int   i,j;
      for (i   = 1;i   <= 9;i   ++ )   {
         for (j   = 1;j   <= i;j   ++ )   {
            printf(   "%d*%d=%d\t" ,j,i,i *   j);
         }
      printf(   "\n" );
      }
}


/*

1*1=1;
1*2=2; 2*1=2;
1*3=3; 2*2=4;
...

1*9=9; 2*9=18;

*/   // 实际排列原理相反:   有多少行就有多少列。




/* Note:Your choice is C IDE */12
#include   "stdio.h"
#include   "string.h"
void   main()
{
      
    // 2. 输入一行字符,分别统计出其中字母、空格、数字和其他字符的个数。
    char   s[200];
    int   l,i,a   = 0,b   = 0,c   = 0;
  printf( " 请输入一行字符   " );
  gets(s);
  l = strlen(s);
    for (i   = 0;i   < l;i   ++ )
    {
      if (s[i]   == ' '   )
      {
      a   ++ ;
      }
      if (s[i]   >= '0'   && s[i]   <= '9'   )
      {
       b   ++ ;             
      }
      if (s[i]   >= 'A'   && s[i]   <= 'Z'   ||   s[i] >=   'a' &&   s[i] <=   'z' )
      {
      c   ++ ;
      }
    }
  printf( " 空格:   %d, 数字:   %d, 字母:   %d" ,a,b,c);
}




/* Note:Your choice is C IDE */13
#include   "stdio.h"
void   main()
{
      int   r,c,row;
    printf( " 请输入菱形的对角线的长度   :" );
    scanf( "%d" ,   & row);
               for (r   = 1;r   <= row   * 2   - 1;r   ++ )
               {
                     for (c   = 1;c   <= row   * 2   - 1;c   ++ )
               {
                           if (r   <= row   &&   c   == row   + 1   - r   ||   c   == row   - 1   + r)
                              printf(   "*" );
                           else   if (r   >= row   &&   c   == r   - row   + 1   ||   c == row + row * 2 - 1 - r)
                              printf(   "*" );
                           else
                              printf(   " " );
               }
            printf(   "\n" );
               }
}














/* Note:Your choice is C IDE */14
#include   "stdio.h"
#define   X 9
void   main()
{
      int   arr[X][X];
      int   i,j;
      int   L   = X   / 2   + 1;
    arr[0][0] = 1;   // 确定顶角
   
   
      for (i   = 1;i   <= L;i   ++ )   {
      
         for (j   = 1;j   <= X   - i;j   ++ )   {     //
           if (j   >= i   - 1)
         arr[i   - 1][j]   = arr[i   - 1][j   - 1]   + 1;        // 核心代码
         }
      
         for (j   = i;j   <= X   - i;j   ++ )   {     //
         arr[j][X   - i]   = arr[j   - 1][X   - i]   + 1;     
         }
      
         for (j   = X   - i   - 1;j   >= i   - 1;j   -- )   {     //
         arr[X   - i][j]   = arr[X   - i][j   + 1]   + 1;     
         }
      
         for (j   = X   - i   - 1;j   > i   - 1;j   -- )   {     //
         arr[j][i   - 1]   = arr[j   + 1][i   - 1]   + 1;     
         }
      }
   
      // 输出
     for (i   = 0;i   < X;i   ++ )   {
         for (j   = 0;j   < X;j   ++ )   {
         printf(   "%d\t" ,arr[i][j]);
         }
      printf(   "\n\n" );
      }
}





/* Note:Your choice is C IDE */
#include   "stdio.h"
#define   num 10
void   main()
{
      int   i,j,temp;
      int   a[num]   = {   1,4,2,5,9,3,6,12,55,0 } ;
    printf( " 冒泡排序:   \n" );
   
      for (i   = 0;i   < num   - 1;i   ++ )
      {
        for (j   = i   + 1;j   < num;j   ++ )
        {
          if (a[i]   > a[j])
           {
            temp   = a[j];
            a[j]   = a[i];
            a[i]   = temp;
           }   
        }      
      }
        for (i   = 0;i   < num;i   ++ )
      printf(   "%5d" ,a[i]);
   
}







/* Note:Your choice is C IDE */15
#include   "stdio.h"
#define   N 3   //   前几名
void   main()
{
      int   arr[10]   = {   20,30,50,60,60,76,85,85,96,96 }   // 已经升序的数组
      char   names[10][20] = { "jack"   , "running"   , "lucy"   , "mary"   , "hong"   , "liu"   , "wike"   , "smith"   , "boss"   , "younth"   } ;
      int   hasCount   = 0;   // 已经统计了的个数
      int   count[N   + 1]   = {   0 }     //   第一个 num[0] 不要,记录第几名的个数。
      int   score[10]   = {   0 }     //   统计成绩   score[1]=96  score[2]=85    记录第几名的成绩
      int   k,j,i,len   = 0,c   = 0;
   
      for (k   = 1;k   <= N;k   ++   // 处理过程
      {
      hasCount   = 0;
               for (j   = 1;j   <= k;j   ++ )
               {  
                        hasCount   += count[j];    //   统计前面出现的总个数
               }
               for   (i   =   9   - hasCount; i   >=   0; i   -- )
               {
                           if   (arr[i]   ==   arr[9 - hasCount])
                           {
                              score[k]   = arr[9   -   hasCount];    // 记录具体第几名的分数
                              count[k]   ++   // 记录具体第几名的个数
                           }
               }      
      }

      // 输出
      for   (i   =   1; i   < N   + 1; i   ++ )
      {
       hasCount   = 0;
           for (j   = 1;j   <= i;j   ++ )   //   统计前面出现的总个数
           {  
                        hasCount   += count[j];           
           }
         printf(   "\n   %d   , 个数   %d, 成绩为   :%d\n" ,i,count[i],score[i]);
           for (c   = 1,k   = 10   - hasCount;c   <= count[i];k   ++ ,c   ++ )      //count[i]     当前第几名的个数
         {  
            printf(   " 名字: %s\n"   ,names[k]);
         }     
      }   
}




/* Note:Your choice is C IDE */16
#include   "stdio.h"
#define   num  13
void   main()
{
      /* 古典问题:有一对兔子,从出生后第   3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
      问每个月的兔子总数为多少?兔子的规律为数列   1,1,2,3,5,8,13,21....*/
  
      int   a[num]   = {   1,1 }   ;
      int   i;
    printf( " 兔子问题:   \n" );
      for (i   = 0;i   < num;i   ++ )
      {
         if   (i   <= 1)
         {
         printf(   " %d   个月的兔子总数为   1   \n" ,i   + 1);
         }
          else
          {
          a[i]   = a[i   - 1]   + a[i   - 2];
          printf(   " %d   个月的兔子总数为   %d   \n" ,i   + 1,a[i]);
          }
      }  
}






/* Note:Your choice is C IDE */17
#include   "stdio.h"
#define   N 28
void   main()
{
      char   S1S88[N][15]   = {
         " 廖培鑫 1"   ,   "   吴馨 1" ,   " 陈智聪 1"   ,   "1   颜理 " ,   " 梅清康 1"   ,   "   甘焕昌 1" ,
          " 刘志威 1"   ,   "   钟晖 1" ,   " 黄鹏 1"   ,   "   李景生 1" ,   " 应俊伟 1"   ,   "   黄协平 1" ,
          " 余绍广 1"   ,   "   朱海宁 1" ,   " 陈日鸿 1"   ,   "   王瑾 1" ,   " 陈江东 1"   ,   "   胡志雄 1" ,
          " 张经纬 1"   ,   "   林文山 1" ,   " 梁正丽 1"   ,   "   蒋婷婷 1" ,   " 陈章维 1"   ,   "   梁家英 " ,
          " 黄胜利 1"   ,   "   张李斌 1" ,   " 吴全辉 1"   ,   "   戴志颖 1" }   ;
      char   bl[N];
      int   i,n;
      int   index;       // 索引,轮到第几个人了    
      int   lastnum   = N;    // 剩余人数
      int   countNum   = 0;   // 报的数字
      for (i   = 0;i   < N;i   ++ )
       {   bl[i]   = 1;    }   //28 个人都参与报数
      
    printf( " 请输入从第几个人开始报数:   " );
    scanf( "%d" ,   & n);
    printf( "\n   %s 开始报数   :" ,S1S88[n-1]);
    index = n - 1;
   
      while (lastnum   > 1)    // 如果剩余人数大于   1   说明还要继续报数
      {
         if (bl[index])   // 表示还没报   3 的人。
         {
            countNum   ++ ;
               if (countNum   == 3)
               {    countNum   = 0;
                  bl[index]   = 0;   // 标记报了   3
                  lastnum   --   // 剩余人数   -1
               }
         }
      index   ++ ;   // 下一个人
      
         if (index   == N)    // 报到最后,回来继续报数
        index   = 0;
      }
   
   
      // 输出
      for (i   = 0;i   < N;i   ++ )
      {
        if (bl[i])
        printf(   "\n\n 留下来的是: %s"   ,S1S88[i]);  
      }
   
}





/* Note:Your choice is C IDE */ 18
#include   "stdio.h"
void   main()
{
       // 求下列试子的值:   1/1-1/2+1/3-1/4+ …… +1/99-1/100   ,将结果输出。   这里要注意   1.0   分子是小数才会是小数,用   float 会溢出。
    
       int   fm;
       double   sum   = 0.0;
       for (fm   = 1;fm   <= 100;fm   ++ )   {
         if (fm   % 2   == 0)   {
                  sum   -= 1.0   / fm;
         }else{
                  sum   += 1.0   / fm;
         }
       }
    
     printf(   "the result is : %.2f" ,sum);
}










/* Note:Your choice is C IDE */19
#include   "stdio.h"
void   main()
{
      int   arr[15][15];
      int   i,j;
      for (i   = 0;i   < 10;i   ++ )   {
      arr[i][0]   = 1;
      arr[i][i]   = 1;
      }
   
      // 从第三行开始出现规律
      for (i   = 2;i   < 10;i   ++ )   {
         for (j   = 1;j   < i;j   ++ )   {
            arr[i][j]   = arr[i   - 1][j]   + arr[i   - 1][j   - 1];
         }
      }
   
      // 输出
      for (i   = 0;i   < 10;i   ++ )   {
         /*for(j=0;j<10-(i+1);j++){
            printf("\t");
      }*/
      
         for (j   = 0;j   <= i;j   ++ )   {
            printf(   "%d\t" ,arr[i][j]);
         }
      printf(   "\n" );
      }
   
}
 
 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值