算法实践(一)

/*本文为平时练习之作,若有错误还望指出,谢谢。*/


1-1 韩信点兵  (枚举是最直接的解决办法

法一:

#include<stdio.h>

void main()

{

        /*思路:总数减去余数再整除3,5,7 */

        int a,b,c,sum;

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

        for(sum=10;sum<=100;sum++)

        {

                if((sum-a)%3==0)

                {

                        if((sum-b)%5==0)

                        {

                                if((sum-c)%7==0)

                                {

                                        printf("the sum is: %d\n",sum);

                                        break;  //输出结果, 跳出循环

                                }

                          }

                }

        }

        if(sum > 100)

        {

                printf("No answer");

        }

}

法二:

#include<stdio.h>

int main()

{     

          int i = 10;

          int a,b,c;

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

          

            while(i < 100)

           {
                if((i%3 == a)&&(i%5 == b)&&(i%7 == c))
               {
                         printf("people : %d\n", i);
                         return 0;
                 }

                 i++;         

            }

          printf("no answer\n");   

}




1-2 倒三角形

(解析:外层for循环控制输出的行数(第i行),内层两个for循环分别输出相应行数的空格数目和“#”数目。)

法一:

#include<stdio.h>

void main()

{

    /*思路:按照每行共有 2n个格,n为行数,i为递减的变量, 空格的数量每行为 2*i-1#的数量为n-i*/

         int n,i,j,k;

         scanf("%d",&n);    //输入n的值

         for(i=n;i>0;i--)     //因为是倒三角,所以自减

        {

                for(k=0;k<n-i;k++)     //控制空格

                {

                         printf(" ");

                }

                for(j=0;j<2*i-1;j++)   //输出一行上的“#”

                {

                         printf("#");

                }

                        printf("\n");

         }

}

法二:




1-3 序列求和

#include<stdio.h>

void main()

{

        int n,m;

        double result;

        result = 0.0;

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

        if(m<1000000)

        {

                for(;n<=m;n++)   

                result +=(1.0/n)*(1.0/n);    /*若按原公式步骤会报错*/

                printf("The result is: %.5f\n",result);

        }

        else

                printf("Please reenter the data!");

 }

 


1-4    蛇形

#include <iostream>

#include <cstring>

#include <cstdio>

using namespace std;

int a[15][15];

 

int main()

{

        int n;

        while(~scanf("%d", &n))

        {

                int i=1, j=n;

                int k=n*n, t=1;

                memset(a,0,sizeof a);

                a[i][j]=t++;

                while(t<=k)

                {

                        while(a[i+1][j]==0 && i+1<=n)

                        a[++i][j]=t++;

                        while(a[i][j-1]==0 && j-1>=1)

                        a[i][--j]=t++;

                        while(a[i-1][j]==0 && i-1>=1)

                        a[--i][j]=t++;

                        while(a[i][j+1]==0 && j+1<=n)

                        a[i][++j]=t++;

                }

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

                {

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

                        printf("%4d", a[i][j]);

                        printf("\n");

                 }

        }

        return 0;

}




1-5    竖式问题

#include <stdio.h>  

#include <string.h>  

int main()  

{  

    int abc, de, x, y, z, i, ok, count = 0;  

    char s[20], buff[100];  

    scanf("%s", s);  

  

    for (abc = 100; abc < 999; abc++)  

    {  

        for (de = 10; de < 99; de++)  

        {  

            x = abc * (de % 10);  

            y = abc * (de / 10);  

            z = abc * de;  

            sprintf(buff, "%d%d%d%d%d", abc, de, x, y, z);  

            ok = 1;  

            for (i = 0; i < strlen(buff); i++)  

                if (strchr(s, buff[i]) == NULL)  

                    ok = 0;  

            if (ok)  

            {  

                printf("<%d>\n", ++count);  

                printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n", abc, de, x, y, z);  

            }  

        }  

    }  

    printf("The number of solutions = %d\n", count);  

    return 0;  

}  


1-6 最长回文子串
#include "stdafx.h"  
#include <iostream>  
#include <string>  
using namespace std;  
class Solution {  
public:  
    string longestPalindrome(string s) {  
        const int n=s.size();  
        bool dp[n][n];  
        fill_n(&dp[0][0],n*n,false);  
        int max_len=1; //保存最长回文子串长度  
        int start=0;//保存最长回文子串起点  
        for(int i=0;i<s.size();++i)  
        {  
            for(int j=0;j<=i;++j)  
            {  
                if(i-j<2)  
                    dp[j][i]=(s[i]==s[j]);  
                else  
                    dp[j][i]=(s[i]==s[j] && dp[j+1][i-1]);  
                if(dp[j][i] && max_len<(i-j+1))  
                {  
                    max_len=i-j+1;  
                    start=j;  
                }  
            }  
        }  
        return s.substr(start,max_len);  
    }  
};  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    string input;  
    Solution sln;  
    while(cin>>input)  
    {  
        cout<<"最长回文子串为:"<<sln.longestPalindrome(input)<<endl;  
    }  
    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/Yuan_xln/article/details/79550695