蓝桥杯[每日题例] c++ 1259.奇怪的捐赠
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
地产大亨 Q 先生临终的遗愿是:拿出 100 万元给 X 社区的居民抽奖,以稍慰藉心中愧疚。
麻烦的是,他有个很奇怪的要求:
1.100 万元必须被正好分成若干份(不能剩余)。每份必须是 7 的若干次方元。比如:1 元, 7 元, 49 元,343 元,...
2.相同金额的份数不能超过 5 份。
3.在满足上述要求的情况下,分成的份数越多越好!
请你帮忙计算一下,最多可以分为多少份?
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 请在此输入您的代码
int num = 0;
int money = 1000000;
//本来想定义一个数组,用于统计位数,但是不知道长度所以就定义了vector<int>
vector<int> septinary;
//十进制转七进制
while (money)
{
septinary.push_back(money % 7);
money = money / 7;
}
//迭代器
vector<int>::iterator it;
//1*7^8>1000000,所以1*7^8不在计算考虑的范围内
//1*7^7=823543,而1*7^6=117649,因为相同的金额不能超过五份所以
//即使(1*7^6)*5+(1*7^5)*5+...+(1*7^1)*5都不能超过1*7^7,
//故而不能考虑先用小的七进制将1000000万填满
//只能将其转换为七进制,并对七进制上的每一位数(每一个七次方前面*的倍数,就是钱的份数)
//定义一个num统计即可
for (it = septinary.begin(); it != septinary.end(); it++)
{
/*cout << *it << endl;*/
//遍历
//累加
num += *it;
}
cout << num << endl;
return 0;
}
错误思路:
最开始我对该题的理解是在100万元里找分成7^n的所有可能,将他们进行相加得回100万,在考虑到每个金额不能超过五份时,我将100万分成5份20万进行转化为七进制的计算,得到3*70+4*71+0*72+2*73+6*74+4*75+1*71=200000,在这里我发现了不对劲,我之前没考虑到七进制的前面的位数(即将七进制分成多少份),所以这样子分的后果就是得到(3+4+0+2+6+4+1)*5=35份,与答案16份不一致。
正确思路:
于是我这次不将100万分成五份,并将其转换为七进制,发现七进制前面的数都不超过5份,思考到1*78>1000000,所以1*78不在计算考虑的范围内,且1*77=823543,而1*76=117649,因为相同的金额不能超过五份所以,即使(1*76)*5+(1*75)*5+...+(1*71)*5都不能超过1*77,所以必须要有一个1*77,同理前面也所有的五份相加都不能超过后一位的1份于是不能考虑先将前面用每个七进制*5进行填满,只能将其直接转为七进制,得到完美分割成16分的七进制数。
蓝桥杯[每日题例] c++ 2384.整数分解
问题描述
将 3 分解成两个正整数的和, 有两种分解方法, 分别是 3 = 1 + 2 3 = 1 + 2 和 3 = 2 + 1 3 = 2 + 1 。
注意顺序不同算不同的方法。
将 5 分解成三个正整数的和, 有 6 种分解方法,
它们是 1 + 1 + 3 = 1 + 2 + 2 = 1 + 1 + 3 = 1 + 2 + 2 = 1 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 11 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 1 。
请问, 将 2021 分解成五个正整数的和, 有多少种分解方法 ?
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
//int count = 0;
//超级暴力算法
//该方法最开始我想到的是五次遍历2021将所有的可能进行组合
//并判断他们相加是否=2021
//该方法需要计算机计算2021^5=33715652388894101次,时间复杂度爆表
//我甚至对它进行行了一点优化,考虑到1+1+1+1+2017=2021
//所以我只需要计算2017^5=33383317356629857次
//我特地去查了一下计算机运行一次加法大概需要40ps(1ps=10^(-12)s)
//运算完下面代码大概需要需要花费15.5天,当然这还不包括里面的变量声明赋值的时间
/*for (int i = 1; i <= 2017; i++)
{
for (int j = 1; j <= 2017; j++)
{
for (int k = 1; k <= 2017; k++)
{
for (int l = 1; l <= 2017; l++)
{
for (int m = 1; m <= 2017; m++)
{
if (i + j + k + l + m == 2021)
{
count++;
}
}
}
}
}
}
cout << count << endl;*/
//插空法
//将2021分成2021份1,在里面插入4个分割符将其分成五份便可对应五个正整数的和
//考虑不包头尾,即在2020个空里面进行分割
//分成五份的同时还要保证分割符不能相同,否则会有0+0+0+0+2021的情况出现
long long result;
long long n = 2020;
//结果超出int型所以运算时n也要用long long型
result = (n * (n - 1) * (n - 2) * (n - 3)/(4*3*2*1));
cout << result << endl;
return 0;
}
思路:
方法一:
如题暴力算法,该方法需要计算约20215次时间复杂度极高,计算机需要计算都要十几天
方法二:
该方法非常巧妙找出五个不同且相加为2021的数,于是我们直接对2021进行截取成五段,找出其中所有可能这需要用到高中的插空法进行计算,便可得到结果
蓝桥杯[每日题例] c++ 1038.含2天数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴,因为每天日历上都可以看到 2。
如果日历中只显示年月日,请问从公元 1900年 1 月 1 日到公元 9999 年 12 月 31 日,
一共有多少天日历上包含 2。即有多少天中年月日的数位中包含数字 2。
#include <iostream>
using namespace std;
//传入一个数判断位数上是否存在2
int selecttwo(int n)
{
while (n)
{
if (n % 10 == 2)
{
return 1;
}
n /= 10;
}
return 0;
}
int main()
{
// 请在此输入您的代码
int count = 0;
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
for (int year = 1900; year <= 9999; year++)
{
//对每一年进行闰年判断
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
//是闰年,则将其的二月赋值为29天
days[2] = 29;
}
else
{
//不是就将它的二月赋值回28天
days[2] = 28;
}
//月份
for (int month = 1; month <= 12; month++)
{
//日期
for (int day = 1; day <= days[month]; day++)
{
//传入年月日进行是否存在2判断
if (selecttwo(year) || selecttwo(month) || selecttwo(day))
{
count++;
}
}
}
}
cout << count << endl;
return 0;
}
思路:
我们先定义days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }代表1-12月份,用0顶替掉days[0],然后就对每个年份的闰年进行判断是闰年就将2月赋值为29天,不是就将2月赋值为28天,然后对月和日进行选择,最后定义一个判断年月日中是否有2的函数,调用判断即可
蓝桥杯[每日题例] c++ 160.字符计数
题目描述
给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
输入描述
输入格式:
输入一行,包含一个单词,单词中只包含小写英文字母。单词中的字母个数不超过 100。
输出描述
输出两行,第一行包含一个整数,表示元音字母的数量。
第二行包含一个整数,表示辅音字母的数量。
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 请在此输入您的代码
int a = 0;
int b = 0;
string n;
cin >> n;
for (int i = 0; i < n.length(); i++)
{
if (n[i] == 'a' || n[i] == 'e' || n[i] == 'i' || n[i] == 'o' || n[i] == 'u')
{
a++;
}
else
{
b++;
}
}
cout << a << endl << b << endl;
return 0;
}
思路:
定义a,b记录元音字母个数和辅音字母个数,判断是否是元音字母,是就a+=1,不是就b+=1。
蓝桥杯[每日题例] c++ 2381.三角回文数
问题描述
对于正整数 n, 如果存在正整数k使得 n = 1 + 2 + 3 + ⋯ + k = k * (k + 1) / 2,
则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066 = 1 + 2 + 3 + ⋯ + 363。
如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数。
例如, 66066 是一个回文数, 8778 也是一个回文数。
如果一个整数 n既是三角数又是回文数, 我们称它为三角回文数。例如 66066 是三角回文数。
请问, 第一个大于 20220514 的三角回文数是多少 ?
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
#include <iostream>
using namespace std;
int main()
{
int num = 0;
for (int i = 0;; i++)
{
//实现1+2+3+4+5+...+n
//即找出所有的三角数
num = num + i;
if (num > 20200514)
{
int temp = num;
int x = 0;
//将该三角数进行倒转
//用于判断回文数
while (temp != 0)
{
x = x * 10 + temp % 10;
temp /= 10;
}
if (x == num)
{
//输出三角回文数
cout << x << endl;
break;
}
/*x = 0;*/
}
}
return 0;
}
思路:
三角数的实质是1+2+3+…+n的累加,定义一个num进行记录,然后对每一个数进行翻转,然后和原来的数进行对比判断是否是回文数,最后输出即可
蓝桥杯 c++[每日题例] 2409.大乘积
问题描述
小蓝有30 个数,分别为:
99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77 。
小蓝可以在这些数中取出两个序号不同的数,共有
30×29/2=435 种取法。
请问这435 种取法中,有多少种取法取出的两个数的乘积大于等于2022 。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int a[30] = { 99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77 };
int count = 0;
//直接找出他们的所有
for (int i = 0; i < 30; i++)
{
//拿到第一个数,让他和后面的数进行相乘
for (int j = i + 1; j < 30; j++)
{
//防止两次拿出一样的数
if(a[i]!=a[j])
{
//余2022进行比较
if (a[i] * a[j] >= 2022)
{
count++;
}
}
}
}
cout << count << endl;
return 0;
}
思路:
直接找出这三十个数的所有组合,同时还要小心不要两次拿出一样的数,这里我一直以为没什么问题,但是提交就是报错,写的时候一时脑子转不过来,我想了十多分钟才解决
蓝桥杯[每日题例] 676.立方尾不变
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
有些数字的立方的末尾正好是该数字本身。 比如:
1, 4, 5, 6, 9, 24, 25, ....
请你计算一下,在10的4次方
以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int count = 0;
for (int i = 1; i <= 10000; i++)
{
//找十位
if ((i * i * i % 10) == i)
{
/*cout<<i*i*i<<endl;
cout<<i<<endl;*/
count++;
}
//找百位
if ((i * i * i % 100) == i)
{
/*cout<<i*i*i<<endl;
cout<<i<<endl;*/
count++;
}
//找千位
if ((i * i * i % 1000) == i)
{
/*cout<<i*i*i<<endl;
cout<<i<<endl;*/
count++;
}
}
cout << count << endl;
return 0;
}
思路:
直接算就可以了
标签:30,进制,int,31,lanqiaobei15,include,回文,21 From: https://www.cnblogs.com/xiaoxinhai/p/17323859.html