蓝桥杯-2013年B组真题
Posted jinzhi666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯-2013年B组真题相关的知识,希望对你有一定的参考价值。
蓝桥杯-2013年B组真题
蓝桥杯-2013年B组真题
参考
https://blog.csdn.net/qq_44391957/article/details/90646760
A.高斯日志
题目标题: 高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,
它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
用计算器 1799-07-17 是错的 从1777-04-30算是第一天 1799-07-17 减去 1777-04-30是间隔! 间隔是少1的,所以答案是 1799-07-16
B.马虎的算式
暴力求解
标题:马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36×495=?
他却给抄成了:396×45=?
但结果却很戏剧性,他的答案竟然是对的!!因为36*495=396*45=17820类似这样的巧合情况可能还有很多,比如:27*594=297*54
假设abcde代表1~9不同的5个数字(注意是各不相同的数字,且不含0)能满足形如:ab*cde=adb*ce这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
答案:120
// 5重循环
#include <iostream>
using namespace std;
int main()
int count = 0;
for (int a = 1; a < 10; a++)// 1
for (int b = 1; b < 10; b++)// 2
if (a != b)
for (int c = 1; c < 10; c++)// 3
if (c != a && c != b)
for (int d = 1; d < 10; d++) // 4
if (d != a && d != b && d != c)
for (int e = 1; e < 10; e++) // 5
if (e != a && e != b && e != c && e != d)
if ((a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b) * (c * 10 + e))
count++;
cout << count;
// 结果是120个
C.第39级台阶
题目描述:
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
约束是偶数步
51167078
没有偶数步约束
f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n - 1) + f(n - 2) f(n)=f(n−1)+f(n−2)
这个规律是发现出来的
// 没有限制是偶数步
ll get_sum(ll n)
if (n == 1 || n == 0)
return 1;
else
return get_sum(n - 1) + get_sum(n - 2);
判断总步数是偶数步
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
int ans = 0;
void f(int n, int step)
/*
n 是剩下的阶梯数
step 是已走的步数
*/
if (n < 0)
return;
// 到终点了,偶数步才算
if (n == 0 && step % 2 == 0)
ans++;
// 走奇数步
f(n - 1, step + 1);
// 走偶数步
f(n - 2, step + 1);
int main()
f(39, 0);
cout << ans;
// ll n;
// cin >> n;
// cout << get_sum(n);
return 0;
D.黄金连分数
黄金分割数0.61803… 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的一种是用连分数:
1
黄金数 = ---------------------
1
1 + -----------------
1
1 + -------------
1
1 + ---------
1 + ...
这个连分数计算的“层数”越多,它的值越接近黄金分割数。
请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。
小数点后3位的值为:0.618
小数点后4位的值为:0.6180
小数点后5位的值为:0.61803
小数点后7位的值为:0.6180340
(注意尾部的0,不能忽略)
你的任务是:写出精确到小数点后100位精度的黄金分割值。
注意:尾数的四舍五入! 尾数是0也要保留!
显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
答案:0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375
C++算出101位小数 0.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748
利用斐波那契数列
1 1 + f ( n ) / f ( n + 1 ) \\frac11+f(n)/f(n+1) 1+f(n)/f(n+1)1
大数加法
模板!
string add(string a, string b)
int len_a = a.length();
int len_b = b.length();
// 答案的长度
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if (len_a > len_b)
for (int i = 0; i < len_a - len_b; i++)
b += '0';
if (len_a < len_b)
for (int i = 0; i < len_b - len_a; i++)
a += '0';
// 初始化全为0, 长度为len
// 这样不好的
string ans = "";
int max_len = max(a.length(), b.length());
// 进位
int k = 0;
int temp = 0;
for (int i = 0; i < max_len; i++)
// 临时的和
temp = (a[i] - '0') + (b[i] - '0') + k;
ans += temp % 10 + '0';
k = temp / 10;
// 这里len_a 是没有改变的值!
if (i == max_len - 1 && k != 0)
ans += k + '0';
reverse(ans.begin(), ans.end());
return ans;
大数除法
1 / 3 1/3 1/3分析 补0做减法 变成10,一直减法,能减去3次,余数是1 得到3次的3就是第一个小数位 这是一个循环 根据余数继续补0
// 转换为减法
// 只考虑a < b
string divide(string a, string b)
string ans = "0.";
int t;
for (int i = 0; i < 101; i++)
a.append("0");
t = 0;
while (cmp(a, b) >= 0)
a = sub(a, b);
t++;
string t_str;
// i2s(t, t_str);
t_str = int_to_str(t);
ans.append(t_str);
return ans;
大数减法
// a 一定大于b
string sub(string a, string b)
// int len_a = a.length();
// int len_b = b.length();
// // 答案的长度
// reverse(a.begin(), a.end());
// reverse(b.begin(), b.end());
// if (len_a > len_b)
//
// for (int i = 0; i < len_a - len_b; i++)
//
// b += '0';
//
//
// if (len_a < len_b)
//
// for (int i = 0; i < len_b - len_a; i++)
//
// a += '0';
//
//
// // 初始化全为0, 长度为len
// // 这样不好的
// string ans = a;
// int max_len = max(a.length(), b.length());
// // 借位
// int temp = 0;
// for (int i = 0; i < max_len; i++)
//
// if (a[i] >= b[i])
//
// ans[i] = a[i] - b[i] + '0';
//
// else
//
// int k = 1;
// while (a[i + k] == '0')
//
// ans[i + k] = '9';
// k++;
//
// ans[i + k] = a[i + k] - '1' + '0';
// ans[i] = a[i] + 10 - b[i] + '0';
//
//
// reverse(ans.begin(), ans.end());
// return ans;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < b.length(); i++)
if (a[i] >= b[i])
a[i] = a[i] - b[i] + '0';
else
int k = 1;
while (a[i + k] == '0')
a[i + k] = '9';
k++;
a[i + k] = a[i + k] - '1' + '0';
a[i] = (a[i] - b[i] + 10) + '0';
reverse(a.begin(), a.end());
if (a.find_first_not_of('0') == string::npos)
return "0";
return a.substr(a.find_first_not_of('0'));
Java
package B组.ex04_黄金分割;
import java.math.BigDecimal;
public class Main
public static void main(String[] args)
BigDecimal bd = new BigDecimal(1);
for (int i = 0; i < 1000; i++)
// 这里是 + 1
bd = bd.add(BigDecimal.ONE);
bd = BigDecimal.ONE.divide(bd, 100, BigDecimal.ROUND_HALF_DOWN);
// System.out.println(bd.toString());
System.out.println(bd.toString());
基本大数运算
package B组.Java高精度;
import java.math.BigDecimal;
import java.util.Scanner;;
public class Main
public static void main(String[] args)
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
String b = scanner.next();
BigDecimal a_big = new BigDecimal(a);
BigDecimal b_big = new BigDecimal(b);
// 初始化0
BigDecimal ans = new BigDecimal("0");
ans = ans.add(a_big);
ans = ans.add(b_big);
System.out.println(ans);
参考
https://blog.csdn.net/qq_44691917/article/details/104048858
C++
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <sstream>
using namespace std;
#define ll long long
/*
1. 计算斐波那契数列 n n + 1项
2. 再增加n 小数点101位没有变化
3. 大数据的加减乘除
*/
int n = 10;
string add(string a, string b);
string divide(string a, string b);
int cmp(string a, string b);
string sub(string a, string b);
int cmp(string a, string b)
if (a.length() > b.length())
return 1;
if (a.length() < b.length())
return -1;
else
if (a == b)
return 0;
else if (a > b)
return 1;
else
return -1;
void i2s(int t, string &t_str)
stringstream ss;
ss << t;
ss >> t_str;
// a 一定大于b
string sub(string a, string b)
// int len_a = a.length();
// int len_b = b.length();
// // 答案的长度
// reverse(a.begin(), a.end());
// reverse(b.begin(), b.end());
// if (len_a > len_b)
//
// for (int i = 0; i < len_a - len_b; i++)
//
// b += '0';
//
//
// if (len_a < len_b)
//
// for (int i = 0; i < len_b - len_a; i++)
//
// a += '0';
//
//
// // 初始化全为0, 长度为len
// // 这样不好的
// string ans = a;
// int max_len = max(a.length(), b.length());
// // 借位
// int temp = 0;
// for (int i = 0; i < max_len; i++)
//
// if (a[i] >= b[i])
//
// ans[i] = a[i] - b[i] + '0';
//
// else
//
// int k = 1;
// while (a[i + k] == '0')
//
// ans[i + k] = '9';
// k++;
//
// ans[i + k] = a[i + k] - '1' + '0';
// ans[i] = a[i] + 10 - b[i] + '0';
//
//
// reverse(ans.begin(), ans.end());
// return ans;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < b.length(); i++)
if (a[i] >= b[i])
a[i] = a[i第九届蓝桥杯JavaA组(2018年)省赛真题解析