0基础学算法(算法总结)

224 阅读3分钟

位数算法

取数算法(分正(要知道位数),逆两种)

正:int t, n;                            逆:int t;
    for (i = k - 1; i >= 0; i--)            while(s!=0)
     {                                     { 
        t = s / pow(10.0, (float)(i));        t=s%10;                 
        n = t % 10;                           s=s/10;                            }                                        printf("%d",t);
                                            }                    
                                                                

逆向(回文算法)

                          int n=0(赋初值很重要)
                          while(s!=0)
                          {
                              t=s%10;//逆向取位
                              s=s/10
                              
                              n=n*10+t;//回文
                          }

规则图形的规则排序问题:()

这类题目一般都是用大循环加上若干小循环实现,外层for是用于“行”,内层for则是用于每行打印内容的一个“循环的次数”(很考验逻辑思维),难点在于每个循环条件的确立
1、有时候内层循环的内容可能与行序有函数关系,则内层循环的条件就与外层i有关
2、也会出现与总行数和行序都有关的,则内层循环的判断条件就会与i和n有关

金字塔
下面这个金字塔例子就是其内部三个循环均与外层循环有关,也就是都与‘行数’有关
1、空格问题:
易知每行空格的数量随行序增加而减少,则为降序打印,且总行数发生改变时,第一行的空格打印循环次数随之增加,即其判断条件即与行序有关,又与总行数有关,则其判断条件就会与n,i有关。 2,字母升序,降序循环打印问题:
易知每行字母无论升序还是降序,其循环打印的字母个数均随行序增加而增加,则为升序打印,且易知总行数发生改变时,第一行的字母打印循环次数不变。所以其判断条件就只与行序有关所以判断条件就只会与i有关

#include <stdio.h>
int main()
{
    char a;
    int n;
    printf("输入一个字母\n");
    scanf("%c",&a);
    printf("输入你想要输入的行数\n");
    scanf("%d",&n);
    int i,j,k,m,c;
    for(i=1;i<=n;i++)
    {   
        c=a-1;
        for(j=1;j<=n-i;j++)//升
        {
            printf(" ");
        }
        for(k=1;k<=i;k++)
        {
            c=c+1;
            printf("%c",c);
        }
     
        for(m=1;m<=i-1;m++)
        {
            c=c-1;
            printf("%c",c);
        }
        printf("\n");
    }

    return 0;
}

菱形打印

#include <stdio.h>
int main()
{
    int n;
    printf("你想输入几行(奇数):");
    scanf("%d", &n);
    while (n % 2 == 0)
    {
        printf("输入错误,请重新输入奇数:");
        scanf("%d", &n);
    }
    int i, t, k;
    for (i = 1; i <= (n + 1) / 2; i++)//上半部分
    {
        for (t = 1; t <= (n + 1) / 2 - i; t++)//降
        {
            printf(" ");
        }
        for (k = 1; k <= 2 * i - 1; k++)//升
        {
            printf("*");
        }
        printf("\n");//每一行打印完成后,换行,继续下一行的打印
    }
    int j, m, g;
    for (j = 1; j <= i - 2; j++)//下半部分
    {
        for (m = 1; m <= j; m++)//升
        {
            printf(" ");
        }
        for (g = 1; g <= -2 * j + n; g++)//降
        {
            printf("*");
        }
        printf("\n");每一行打印完成后,换行,继续下一行的打印
    }

    return 0;
}

其里面主要的问题有

*号的数量为升序时:
               空格:为降序打印
               *号:为升序打印(奇数升序(等差数列知识),2n-1)
*号的数量为降序时:
               空格:为升序打印
               *号:为降序打印(奇数降序(等差数列知识),-2*j+n)
所以将要分成两块大循环,里面再接不同类型的小循环;

所以就可用刚才给出的 内容数量升降序 的结论来确定小循环中的判断条件