C语言经典算法

时间:2021-08-02 03:58:33

//1, 九九乘法表

   for (int i =0; i <9; i++) {

       for (int j =0; j < i +1; j++) {

           printf("%d * %d = %-3d",i +1,j +1,(j +1) * (i +1));

        }

       printf("\n");

    }   

//2, 100以内的素数

   for (int i =2; i <101; i++) {

       for (int j =2; j < i; j++) {

           if (i % j ==0) {

               break;

                }

           if (j +1 == i) {

               printf("%d\n",i);

            }

        }        

    }

//3, 输入两个数,求最小公倍数和最大公约数

方法一:

   int m =0,n =0;

   scanf("%d,%d",&m,&n);

   int max = m > n ? m : n;

   int min = m < n ? m : n;

   if ((max % min) ==0) {

       printf("%d\n",min);

    }else{

       for (int i =1; i < min /2; i++) {

           if ((min % i ==0) && (max % i ==0)) {

               printf("%d\n",i);

            }

        }

    }

方法二:辗转相除法求最大公约数   

   int m =0,n =0,a =0,b =0;

   scanf("%d,%d",&a,&b);

   m = a;

   n = b;

   while (n !=0) {

       int c = m % n;

        m = n;

        n = c;

   }

   printf("%d\n",m);

   printf("%d\n",a * b / m);

//4、打印一个 各个位立方之和等于该整数的三位数(水仙花数)

方法一:

   int result =0;

   for (int i =100; i <1000; i++) {

       int unit = i %10;

       int decade = i /10 %10;

       int hundreds = i /100;

        result = hundreds * hundreds * hundreds + decade * decade * decade + unit * unit * unit;

       if (i == result) {

            printf("%d\n",result);

        }

    }   

方法二:

   for (int i =1; i <10; i++) {

       for (int j =0; j <10; j++) {

           for (int k =0; k <10; k++) {

               if (i*i*i + j*j*j + k*k*k == i *100 + j *10 + k) {

                    printf("%d\n", i *100 + j *10 + k);

                }

            }

        }

    }

//5、使用循环打印三角形

//输出以下图形

//  *

// ***

//*****

// ***

//  *

//算法一:

    int n;// n*最多的那一行的行数    

    printf("Enter n:");

   scanf("%d",&n);

    

   for (int i = n -1; i > 0; i--) {

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

           printf(" ");

        }

       for (int j =0; j < n * 2 -2 * i - 1; j++) {

           printf("*");

        }

       printf("\n");

    }

   for (int i =0; i < n ; i++) {

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

           printf(" ");

        }

       for (int j =0; j < n * 2 -2 * i - 1; j++) {

           printf("*");

        }

       printf("\n");

    }

    //算法二:

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

    {

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

           printf(" ");

       for(j=1;j<=2*i-1;j++)

           printf("*");

       printf("\n");

    }

   for(i=n-1;i>=1;i--)

    {

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

           printf(" ");

       for(j=1;j<=2*i-1;j++)

           printf("*");

       printf("\n");

    }

    //输出以下图形

    //   *

    //  * *

    // * * *

    //* * * *

    // * * *

    //  * *

    //   *

   int n = 0;

   scanf("%d",&n);

   for (int i =0; i < n - 1; i++) {

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

           printf(" ");

        }

       for (int j =0; j < 2 * i +1; j++) {

           if ((j + 1) %2 == 0) {

               printf(" ");

            }else{

               printf("*");

            }

        }

       printf("\n");

    }

   for (int i =0; i < n; i++) {

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

           printf(" ");

        }

       for (int j =0; j < n * 2 - i *2 - 1; j++) {

           if ((j + 1) %2 == 0) {

               printf(" ");

            }else{

               printf("*");

            }

        }

       printf("\n");

    }

//7、求S(n) = a+aa+aaa+aaaa+...+aa..a之值  

   int a =0,n =0,sn =0,an =0;

    

    printf("请输入a,n值:");

   scanf("%d,%d",&a,&n);

   for (int i =0; i < n; i++) {

        an = an *10 + a;

        sn += an;

       if (i < n -1) {

           printf("%d + ",an);

        }else{

           printf("%d = ",an);

        }

    }

   printf("%d\n",sn);

//8、求1!+2!+3!+4!+..+20!

方法一:二层循环    

   int num =0;

   long sum =0,temp =1;

   scanf("%d",&num);

   for (int i =1; i < num +1; i++) {

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

            temp *= j;

        }

        sum += temp;

        temp =1;

    }

   printf("%ld\n",sum);

方法二:一层循环

   long sum =0,an =1;

    

   for (int i =1; i <21; i++) {

        an *= i;

        sum += an;

    }

   printf("%ld\n",sum);

//9、一个球从100m高度*落下,每次落地后反跳回原来高度的一半,再落下,再反弹。求它在第10次落地时,共经过多少米?第10次反弹多高?

方法一:

    float height = 100,aheight = height / 2;

    

   for (int i =0; i <9; i++) {

        height += aheight *2;

        aheight = aheight /2;

    }

    printf("10次落地时经过的总长度是%f/n",height);

    printf("10次弹起的高度是%f/n",aheight);

方法二:   

   float height =100,sum =0;

    

   for (int i =0; i <10; i++) {

        sum += height *2;

        height /=2;

    }

    sum = sum -100;

   printf("%f",sum);

//10、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第一天共摘多少个桃子   

   int num =1;

   for (int i =0; i <9 +1; i++) {

       printf("%d天有%3d个桃子\n",10 - i,num);

        num = (num +1) *2;

    }

//11. 找出一个二维数组中的鞍点,即该位置上的元素在该行中最大,在该列中最小(也可能没鞍点),打印出有关信息。    

    const int row = 3;   //定义行数

    const int rol = 4;   //定义列数

    //定义一个二维数组,行数列数已定义

    int nArray[row][rol] = {{5,5,5,5},{1,9,9,9},{1,9,9,9}};

    //nMinIndexI用来存放每一列最小值的下标,nMaxIndexJ用来存放每行最大值的下标

    int nMinIndexI = 0,nMaxIndexJ = 0;

    int k = 0;

    

    for (int i = 0; i < row; i++) {     //找出每行最大元素,并记录其下标

        for (int j = 0; j < rol; j++) {

            if (nArray[i][j] > nArray[i][j + 1]) {

                nMinIndexI = i;

                nMaxIndexJ = j;

            }

        }

        for (int j = 0; j < rol; j++) {     //查找同一行是否有和最大值相等的元素

            if (nArray[i][j] == nArray[nMinIndexI][nMaxIndexJ]) {

                for (k = 0; k < row; k++) {

                    //最大值元素与其所在列对比,若遇到比它小的元素,就跳出循环

                    if (nArray[k][j] < nArray[i][j]) {

                        break;

                    }

                }

                //若循环正常结束(未执行break语句),则这个元素就是鞍点

                if (k == row) {

                    printf("鞍点:nArray[%d][%d] = %d\n",i,j,nArray[i][j]);

                }

            }

        }

    }