蓝桥杯 2016/3/17 测试 前6题题解...

只有答案。。。。。将就着看吧 最近没时间写解题报告。。。。
至于为什么没有第7题 。。因为我不会啊。。。。

1

一个串的子串是指该串的一个连续的局部。如果不要求连续,则可称为它的子序列。
比如对串: “abcdefg” 而言,”ab”,”abd”,”bdef” 等都是它的子序列。
特别地,一个串本身,以及空串也是它的子序列。

对两个串而言,可以有许多的共同的子序列,我们关心的是:它们所共同拥有的长度最大的子序列是多长。以下代码实现了这个问题的求解。请填写划线部分缺失的代码。

注意:只填写划线部分缺少的内容,不要填写任何多余的符号或注释、说明等。例如,不要填写已经给出的小括号。

//   tag==1  &&  *p!=' '   


#include 
#include 
#include 
using namespace std;

int get_word_num(char* buf)
{
    int n=0;
    int tag=1;
    char* p=buf;

    for( ; *p!=0&&*p!=13&&*p!=10; p++)
    {
        if(*p==' ' && tag==0)
            tag=1;
        if(   tag==1  &&  *p!=' '   )
        {
            n++;
            tag=0;
        }
    }

    return n;
}

int main()
{
    char buf[1000];
    fgets(buf,1000,stdin);

    printf("%d\n", get_word_num(buf));
    return 0;
}

2

1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。

它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。

但是,它发散的很慢:

前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0

那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?

请填写这个整数。

注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。

#include    
#include 
#include 
#include 
#include 
#define  C  0.57721566490153286060651209
using namespace std;

int main()
{
    double sum=0;
    int flag=0;
    for(int n=1000000; n<10000000; n++)
    {
        if(log(n)+C>=15)
            {
                printf("%d\n",n);
                break;
            }
    }
    return 0;
}

//----------------- 正常解法

#include
int main()
{
    int n,k;
    double sum=0;
    for(int i=1; i<10000000000000; i++)
    {
        double m=double((1000000000000000000.0/i));
        sum+=m;
       // printf("i=%d  m=%d  sum=%d\n",i,m,sum);
        if(sum>=15000000000000000000)
        {
            printf("i=%d  sum=%d",i,sum);
            break;
        }

    }
    return 0;
}

3


如果x的x次幂结果为10(参见【图1.png】),你能计算出x的近似值吗?

显然,这个值是介于2和3之间的一个数字。

请把x的值计算到小数后6位(四舍五入),并填写这个小数值。

注意:只填写一个小数,不要写任何多余的符号或说明。

//手动二分


#include 
#include 
int main()
{
    double x=2.506184;

    double x10=pow(x,x);

    printf("%.10lf\n",x10);
    return 0;
}

//暴力
#include 
#include 
int main()
{
   // double x=2.506184;
    double x10;double x;
    for(x=2.000000;x<3;x+=0.0000001)
    {
         x10=pow(x,x);
         if(x10>=10)
            break;
    }
    printf("%.10lf\n",x);
    return 0;
}

4

今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。

#include 
int a[15];
int b[8];

void judge()
{
    for(int i=1; i<15; i++)
        printf("%d",a[i]);

    printf("+++++\n");
}

void dfs(int n)
{
    //еп╤о
/*
    for(int i=1; i<15; i++)
        printf("%d",a[i]);
    printf("      ");
    for(int i=1; i<8; i++)
        printf("%d",b[i]);
    printf("\n");
*/
    if(n>14)
    {
         judge();
         return ;
    }

    if(a[n])
    {
        dfs(n+1);
        return;
    }


    int sum=0;
    for(int i=1; i<7; i++)
    {
        if(b[i])
            sum+=i;
    }
    if(sum==21)
    {
         judge();
         return ;
    }



    for(int i=1; i<7; i++)
    {
        if(b[i]||a[n+1+i]||n+1+i>14||i==4)
            continue;

        if(a[n])
        {
            i--;
            continue;
        }
        a[n]=i;
        a[n+i+1]=i;
        b[i]=1;
        dfs(n+1);
        a[n]=0;
        a[n+i+1]=0;
        b[i]=0;
    }

}

int main()
{
    a[1]=7,a[2]=4,a[7]=4,a[9]=7;
    b[7]=1,b[4]=1;

    dfs(3);

  //  judge();
    int s;
    scanf("%d",&s);
    return 0;
}

5

勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。

已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。

求满足这个条件的不同直角三角形的个数。

【数据格式】
输入一个整数 n (0 < n < 10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。

例如,输入:
5
程序应该输出:
1

再例如,输入:
100
程序应该输出:
2

再例如,输入:
3
程序应该输出:
0

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include 
#include 
#include 
using namespace std;
int main()
{
    int n,sum;
    cin>>n;

    sum=0;
    double other;
    for(int i=1; iif(sqrt(other)==(int)sqrt(other))
            sum++;
    }
    cout<2<return 0;
}

6

你一定听说过“数独”游戏。
如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求:
输入9行,每行9个数字,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。

例如:
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700

程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764

再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400

程序应该输出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include 
#include 
#include 
#include 
using namespace std;

char a[20][20],f=0;

int judge(int x,int y)
{
    //判断横竖有没有重的
    for(int i=1; i<10; i++)
    {
        if(i!=y&&a[x][i]==a[x][y]||i!=x&&a[i][y]==a[x][y])
            return 0;
    }
    //判断小九宫格里有没有重的
    int xx,yy;

    if(x>=1&&x<=3)
        xx=1;
    else if(x>=4&&x<=6)
        xx=4;
    else if(x>=7&&x<=9)
        xx=7;

    if(y>=1&&y<=3)
        yy=1;
    else if(y>=4&&y<=6)
        yy=4;
    else if(y>=7&&y<=9)
        yy=7;

    int xxx=xx+3,yyy=yy+3;
    for(int i=xx; ifor(int j=yy; jif(a[i][j]==a[x][y])
                if(i!=x&&j!=y)
                    return 0;
        }
    }
    return 1;
}

void output()
{
    for(int i=1; i<=9; i++)
    {
        puts(a[i]+1);
    }
    return ;
}

void dfs(int x,int y)
{
    if(f==1)
        return;
    if(x==9&&y==9)//到头了 要跳回去
    {
        output();
        f=1;
        return ;
    }
    for(int i=x; i<10; i++)
    {
        for(int j=1; j<10; j++)
        {
            if(a[i][j]!='0')
            {
                if(i==9&&j==9)
                {
                    output();
                    f=1;
                    return ;
                }
                continue;
            }

            for(int k=1; k<10; k++)
            {
                a[i][j]=k+'0';
                if(judge(i,j))
                    dfs(i,j);
                a[i][j]='0';
                if(i==9&&j==9)//到头了 要跳回去
                {
                    output();
                    f=1;
                    return ;
                }
                if(k==9)
                    return ;
            }
        }
    }
}

int main()
{
    // freopen("in.txt", "r", stdin);
    // freopen("outt.txt", "w", stdout);

    for(int j=1; j<=9; j++)
    {
        gets(a[j]+1);
    }
    dfs(1,1);
    return 0;
}

你可能感兴趣的:(蓝桥杯,蓝桥杯,测试,2016-3-17)