[原创]蓝桥杯 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; }