第八届蓝桥杯大赛个人赛决赛(软件类)真题C++
哥德巴赫分解
哥德巴赫猜想认为:不小于4的偶数都可以表示为两个素数的和。
你不需要去证明这个定理,但可以通过计算机对有限数量的偶数进行分解,验证是否可行。
实际上,一般一个偶数会有多种不同的分解方案,我们关心包含较小素数的那个方案。
对于给定数值范围,我们想知道这些包含较小素数方案中最大的素数是多少。
比如,100以内,这个数是19,它由98的分解贡献。
你需要求的是10000以内,这个数是多少?
注意,需要提交的是一个整数,不要填写任何多余的内容(比如,说明性的文字)
答案:173
#include <bits/stdc++.h> /**
@author:d g w
*/
using namespace std;
typedef long long LL ; const int maxn=1e4; int prime[maxn];
int pnum;
int hashtable[maxn]={false};
void f(){
for(int i=;i<maxn;i++){
if(hashtable[i]==false){
prime[pnum++]=i;
for(int j=i+i;j<maxn;j+=i){
hashtable[j]=true;
}
}
}
} int main()
{
f();
for(int i=;i<pnum;i++){
cout<<prime[i]<<" ";
}cout<<endl;
int ans[maxn]={},re=;bool flag=true;
for(int i=;i<=;i+=){
for(int j=;j<=i/;j++){
if(hashtable[j]==false&&hashtable[i-j]==false){
cout<<i<<"="<<j<<"+"<<i-j<<endl;
ans[re++]=min(j,i-j);
break;
}
}
}
int res=;
for(int j=;j<re;j++){
res=max(res,ans[j]);
}
cout<<res;
system("pause");
return ;
}
- 比较容易出错的枚举算法,很多细节需要注意;
#include <bits/stdc++.h> /**
@author:d g w
*/
using namespace std;
typedef long long LL ; const int maxn=1e5; int prime[maxn];
int pnum;
int hashtable[maxn]= {false};
void f()
{
for(int i=; i<maxn; i++)
{
if(hashtable[i]==false)
{
prime[pnum++]=i;
for(int j=i+i; j<maxn; j+=i)
{
hashtable[j]=true;
}
}
}
} int main()
{
f();
for(int i=; i<pnum; i++)
{
cout<<prime[i]<<" ";
}
cout<<endl;
int ans[]= {},re=; for(int i=; i<=; i+=)
{
bool flag=true;
for(int j=; prime[j]<; j++)//200以内就够了,可以打印出来看看规律
{
for(int k=j+; prime[k]<; k++)//易错点 顶峰值必须相近 要保证有最小值另一个加数必须大
{
if((prime[j]+prime[k])==i)
{
cout<<prime[j]<<"+"<<prime[k]<<endl;
ans[re++]=min(prime[j],prime[k]);
flag=false;
}
}
if(flag==false)break;
}
} int res=;
for(int j=; j<re; j++)
{
res=max(res,ans[j]);
}
cout<<res;
system("pause");
return ;
}
标题:数字划分
w星球的长老交给小明一个任务:
1,2,3...16 这16个数字分为两组。
要求:
这两组数字的和相同,
并且,两组数字的平方和也相同,
并且,两组数字的立方和也相同。
请你利用计算机的强大搜索能力解决这个问题。
并提交1所在的那个分组的所有数字。
这些数字要从小到大排列,两个数字间用一个空格分开。
即类似:1 4 5 8 ... 这样的答案。
注意,只提交这一组数字,不要填写任何多余的内容。
----------------------------------------
笨笨有话说:
只要一个组的成员确定了,另一个组的成员也就确定了。枚举一个组的成员就可以了。
凭直觉,两个组的成员数目不会差太多吧。
歪歪有话说:
既然求 1 所在的那个组,那只要枚举剩余的成员就可以了。
貌似都是8个成员的可能性很大啊。
answer:1 4 5 8 9 10 15 16
#include <bits/stdc++.h>
/**
@author:d g w
*/
using namespace std;
typedef long long LL ; const int maxn=1e5; int prime[maxn];
int pnum;
int hashtable[maxn]= {false};
void f()
{
for(int i=; i<maxn; i++)
{
if(hashtable[i]==false)
{
prime[pnum++]=i;
for(int j=i+i; j<maxn; j+=i)
{
hashtable[j]=true;
}
}
}
}
int a[]={,,,,,,,,,,,,,,,};
int main()
{ int flag=true;
do{
if(!flag)break;
//1 4 5 8
if(a[]==&&a[]==&&a[]==&&a[]==){
int x=a[]+a[]+a[]+a[]+a[]+a[]+a[]+a[];
int y=a[]+a[]+a[]+a[]+a[]+a[]+a[]+a[];
if(x==y){
if((x*x)==(y*y)){
if((x*x*x)==(y*y*y)){
//a[0]+a[1]+[2]+a[3]+a[4]+a[5]+a[6]+a[7]
if(a[]<a[]&&a[]<a[]&&a[]<a[]&&a[]<a[]&&a[]<a[]&&a[]<a[]&&a[]<a[]){
cout<<a[]<<' '<<a[]<<' '<<a[]<<' '<<a[]<<' '<<a[]<<' '<<a[]<<' '<<a[]<<' '<<a[]<<endl;
flag=false;
}
}
}
}
} }while(next_permutation(a+,a+));
system("pause");
return ;
}
标题:表达式计算
虽然我们学了许久的程序设计,但对于简单的四则混合运算式,如果让我们完全白手起家地编程来解析,还是有点棘手。
这里,我们简化一下问题,假设只有加法和乘法,并且没有括号来改变优先级。
再假设参加运算的都是正整数。
在这么多的限制条件下,表达式的解析似乎简单了许多。
下面的代码解决了这个问题。请仔细阅读源码,并填写划线部分缺少的代码。
#include <stdio.h> int f3(const char* s, int begin, int end)
{
int sum = ;
int i;
for(i=begin; i<end; i++){
if(s[i]==' ') continue;
sum = sum * + (s[i]-'');
}
return sum;
} int f2(const char* s, int begin, int end)
{
int p = begin;
int pro = ;
while(){
int p0 = p;
while(p!=end && s[p]!='*') p++;
pro *= _______________________________; //填空
if(p==end) break;
p++;
}
printf("f2: pro=%d\n", pro);
return pro;
} int f(const char* s)
{
int p = ;
int sum = ;
while(){
int p0 = p;
while(s[p]!= && s[p]!='+') p++;
sum += f2(s,p0,p);
if(s[p]==) break;
p++;
} return sum;
} int main()
{
int x = f("12+18+5*4*3+10");
printf("%d\n", x);
return ;
}
answer:f3(s,p0,p)
注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。
标题: 小数第n位
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
输入:
一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
输出:
一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
比如:
输入:
1 8 1 0.125
程序应该输出:
125
再比如:
输入:
1 8 3
程序应该输出:
500
再比如:
输入:
282866 999000 6
282866 999 6
程序应该输出:
914
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
----------------------------------------
笨笨有话说:
这个除法小学就会算啊,模拟手算除法的过程就可以了吧。
只是数有点大啊....
管它呢,能算多远算多远....
歪歪有话说:
如果我能确定循环节从哪里开始到哪里结束,再大的数不过就是与它取模的余数等价啊
#include <bits/stdc++.h>
/**
@author:d g w
*/
using namespace std;
typedef long long LL ; const int maxn=1e3; LL MOD=1e9+;
LL P=1e7+; int main()
{
stringstream ss;
string str,str2; LL a,b,n;
cin>>a>>b>>n;
cout<<setprecision()<<(double)a/b<<endl;
ss<<setprecision()<<(double)a/b;
ss>>str;
int j=;
cout<<str<<endl;
for(int i=n+;i<str.length();i++){
str2[j++]=str[i];
}
if(j==){
cout<<str2[]<<"";
}else{
for(int i=;i<j&&i<;i++){
cout<<str2[i];
}
}
system("pause");
return ;
}
扑克牌
给定4张扑克牌 点数为:1~10
用+ - * / 运算,3个运算符结果正好为24
#include <bits/stdc++.h>
/**
@author:d g w
*/
using namespace std;
typedef long long LL ; const int maxn=1e3; LL MOD=1e9+;
LL P=1e7+; const int N=1e5; char rand_op(){
int x=rand()%;
if(x==)return '+';
if(x==)return '-';
if(x==)return '*';
return '/';
} char op(int a,int b,char opr){
if(opr=='+')return (a+b)+'';
if(opr=='*')return (a*b)+'';
if(opr=='-')return (a-b)+'';
if(a%b!=) return 'n';
return a/b;
} bool ji_suan(char buf[]){
stack<char> stk;
for(int i=;i<;i++){
if(buf[i]=='+'||buf[i]=='-'||buf[i]=='*'||buf[i]=='/'){
int a=stk.top()-'';stk.pop();
int b=stk.top()-'';stk.pop();
if(op(a,b,buf[i])=='n'){
return false;
}else{
stk.push(op(a,b,buf[i]));
}
}else{
stk.push(buf[i]);
}
}
if(stk.size()== && (stk.top()-'')==)
return true;
return false;
}
void show(char buf[]){
stack<char> stk;
for(int i=;i<;i++){
if(buf[i]=='+'||buf[i]=='-'||buf[i]=='*'||buf[i]=='/'){
int a=stk.top()-'';stk.pop();
int b=stk.top()-'';stk.pop();
if(op(a,b,buf[i])=='n'){
//return false;
}else{
stk.push('('+stk.top()+buf[i]+stk.top()+')');
} }else{
stk.push(buf[i]);
}
}
cout<<stk.top();
} void f(char str[]){
for(int z=;z<1e4;z++){
char buf[];
for(int i=;i<;i++)buf[i]==str[i];
for(int i=;i<;i++)buf[i]==rand_op(); random_shuffle(buf,buf+);
if(ji_suan(buf)){
show(buf);
}
} } int main()
{
srand((unsigned)time(NULL));
char s[];
while(){
cout<<"input number 4"<<endl;
for(int i=;i<;i++){
cin>>s[i];
}
f(s);
}
system("pause");
return ;
}
第八届蓝桥杯大赛个人赛决赛(软件类)真题C++的更多相关文章
- 第七届蓝桥杯大赛个人赛决赛(软件类C语言B组)第一题:一步之遥
这题好多人用爆搜/bfs来做,然而这题可用exgcd(扩展欧几里得)做,而且很简便. 先附原题: 一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面 ...
- 第九届蓝桥杯大赛个人赛决赛(软件类)真题Java
更新中.......... 同一年的题解:https://www.cnblogs.com/dgwblog/p/10111903.html 01 结果填空 (满分11分) 标题:年龄问题 s夫人一向 ...
- 第八届蓝桥杯JavaC组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.数位和 题目描述 数学家高斯很小的时候就天分过人.一次老师指定的算数题目是:1+2+-+100. 高斯立即做出答案:5050! 这次你 ...
- 第八届蓝桥杯JavaB组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.平方十位数 题目描述 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比 ...
- 第六届蓝桥杯JavaB组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...
- 第六届蓝桥杯JavaA组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...
- 第六届蓝桥杯JavaC组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.机器人数目 少年宫新近邮购了小机器人配件,共有3类,其中, A类含有:8个轮子,1个传感器 B类含有: 6个轮子,3个传感器 C类含有 ...
- 第三届蓝桥杯JavaC组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1. 填算式 [结果填空] (满分11分) 看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字. ...
- 第五届蓝桥杯JavaA组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个 ...
随机推荐
- Sprin Boot2.0之整合Mybatis整合分页插件
pageHelper PageHelper 是一款好用的开源免费的 Mybatis 第三方物理分页插件 物理分页 支持常见的 12 种数据库.Oracle,MySql,MariaDB,SQLite,D ...
- Servlet_03_部署描述符
二.参考文档 1.Servlet 3.0 之 部署描述符 2.web.xml配置详解 部署描述符文件
- 【POJ 3580】SuperMemo Splay
题意 给定$n$个数,$m$个询问,每次在$[L,R]$区间加上一个数,或者反转一个区间$[L,R]$,或者循环右移区间$[L,R]$共$T$次,或者在第$x$个数后插入一个数$p$,或者删除第$x$ ...
- poj3017 Cut the Sequence[平衡树+单调队列优化]
这里已经讲得很清楚了. 本質上是決策點與區間最大值有一定關係,於是用单调队列来维护决策集合(而不是常规的),然后在决策集合中选取最小值. 然后觉得这题方法还是很重要的.没写平衡树,用优先队列(堆)来维 ...
- AtCoder Grand Contest 009 E:Eternal Average
题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_e 题目翻译 纸上写了\(N\)个\(1\)和\(M\)个\(0\),你每次可以选择\(k\) ...
- java计算两个时间相差(天、小时、分钟、秒)
public static Long dateDiff(String startTime, String endTime, String format, String str) { // 按照传入的格 ...
- Python 查看本机WiFi密码
http://www.lijiejie.com/python-get-all-saved-wifi-passwords/ 很早以前我写过一个,丢了. 今天偶然看到这篇文章 , 也是很久以前写的,他用 ...
- [hdu3530]Subsequence (单调队列)
题意:求在一段序列中满足m<=max-min<=k的最大长度. 解题关键:单调队列+dp,维护前缀序列的最大最小值,一旦大于k,则移动左端点,取max即可. #include<cst ...
- CF-845B
B. Luba And The Ticket time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 如何增加新的PointT类型
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=286 为了增加新的point类型,首先需要进行定义,例如: struct M ...