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


答えだけは....我慢して见ましょう最近问题解决のレポートを书く时间がありません...なぜ7題目がないのか.のできないから...

1


1つの列のサブ列は、その列の連続した局所を指す.連続が必要でない場合は、そのサブシーケンスと呼ぶことができます.例えば、列:“abcdefg”にとって、“ab”、“abd”、“bdef”などはすべてそのサブシーケンスである.特に、1つの列自体、および空の列もそのサブシーケンスである.
2つの列には、共通のサブシーケンスが多く存在することができ、共通の長さが最も大きいサブシーケンスがどれだけ長いかに関心を持っています.以下のコードはこの問題の解を実現した.スクライブ部分に欠落しているコードを記入してください.
注意:スクライブ部分に欠けている内容のみを記入し、余分な記号や注釈、説明などは記入しないでください.たとえば、すでに与えられたカッコは記入しないでください.
// tag==1 && *p!=' ' 


#include <stdio.h>
#include <math.h>
#include <iostream>
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
"
, 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を達成または超えるには、どのくらいの項目を追加するかを計算してください.
この整数を記入してください.
注意:整数を1つ記入するだけで、余分な内容を記入しないでください.例えば説明文字.
#include <stdio.h> 
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#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); break; } } return 0; } //----------------- #include<stdio.h> 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
",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桁(四捨五入)に計算し、この小さな数値を記入してください.
注意:小数点を1つだけ記入し、余分な記号や説明は書かないでください.
// 


#include <stdio.h>
#include <math.h>
int main()
{
    double x=2.506184;

    double x10=pow(x,x);

    printf("%.10lf
"
,x10); return 0; } // #include <stdio.h> #include <math.h> 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
"
,x); return 0; }

4


今7対の数字があります:2つの1、2つの2、2つの3、...2つの7、それらを1行に並べます.要求されるのは、2つの1つの間に1つの他の数字があり、2つの2つの間に2つの他の数字があり、このようにして、2つの7の間に7つの他の数字がある.以下に、要件を満たす配列を示します.
17126425374635
もちろん、それを逆さまにすれば、要求に合っています.
もう一つの要求に合った配列法を見つけてください.この配列法は74で始まります.
注意:この14ビットの整数のみを記入し、説明コメントなど、余分な内容を記入することはできません.
#include <stdio.h>
int a[15];
int b[8];

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

    printf("+++++
"
); } 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("
"
); */ 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


勾股定理は、西洋ではピタゴラス定理と呼ばれ、対応する三角形は現在、直角三角形と呼ばれている.
直角三角形の斜辺は整数であることが知られており、他の2つの辺も整数でなければならない.
この条件を満たす異なる直角三角形の個数を求める.
【データ形式】整数n(0)を入力
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
int main()
{
    int n,sum;
    cin>>n;

    sum=0;
    double other;
    for(int i=1; i<n; i++)
    {
        other=n*n-i*i;
        if(sqrt(other)==(int)sqrt(other))
            sum++;
    }
    cout<<sum/2<<endl;

    return 0;
}

6


「数独」ゲームを聞いたことがあるに違いない.【図1.png】のように、プレイヤーは9×9ディスク上の既知の数字は、残りのすべてのスペースの数字を推論し、各行、各列、各同色九宮内の数字は1-9を含み、重複しない.
数独の答えはすべて唯一なので、複数の解は無解とも呼ばれます.
この図の数字はフィンランドの数学者が3ヶ月かけて設計した難しいテーマだそうです.しかし、コンピューターを使ってプログラミングできるあなたにとっては、手のひらを返すようなものかもしれません.
本題の要求は入力数独問題,プログラム出力数独の唯一の解である.私たちはすべての既知のデータのフォーマットが合法であり、テーマに唯一の解があることを保証します.
フォーマット要件:9行を入力し、各行に9個の数値を入力し、0は不明を表し、その他の数値は既知です.9行を出力し,各行9個の数字が数独の解を表す.
例:入力(図中題):005300000 80000020 070010500 4000005300 010070006 003200080 060500009 0040000030 0009700
プログラム出力:145327698 839654127 672918543 496185372 218473956 753296481 367542819 984761235 521839764
例えば、入力:8000000 003600000070090200 050007000 000045700 000100030010000068 008500010 090000400
プログラム出力:812753649 943682175 675491283 154237896 369845721 287169534 5219743368 438526917 796318452
リソース約定:ピークメモリ消費<256 M CPU消費<2000 ms
要求通りに出力し、「入力してください」のような余分な内容を蛇足せずに印刷してください.
すべてのコードを同じソースファイルに配置し、デバッグに合格した後、コピーしてソースコードをコミットします.
注意:main関数は0を返す必要があります注意:ANSI C/ANSI C++標準のみを使用し、コンパイル環境やオペレーティングシステムに依存する特殊な関数を呼び出さないでください.注意:すべての依存する関数は、ソースファイル内のincludeで明確にする必要があります.通常のヘッダファイルは、エンジニアリング設定で省略することはできません.
コミットするときは、目的のコンパイラタイプを選択することに注意してください.
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
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; i<xxx; i++)
    {
        for(int j=yy; j<yyy; j++)
        {
            if(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;
}