[原创]蓝桥杯 2016/3/17 测试 前6题题解…

2016-03-17 12:39:13 Tabris_ 阅读数:2585


博客爬取于2020-06-14 22:44:45
以下为正文

版权声明:本文为Tabris原创文章,未经博主允许不得私自转载。
https://blog.csdn.net/qq_33184171/article/details/50912690


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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//   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\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 呢?

请填写这个整数。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 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",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\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位(四舍五入),并填写这个小数值。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//手动二分


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

double x10=pow(x,x);

printf("%.10lf\n",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\n",x);
return 0;
}


4

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

17126425374635

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# include <stdio.h>
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, 不能通过工程设置而省略常用头文件。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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
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, 不能通过工程设置而省略常用头文件。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# 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;
}