C++课后习题训练记录Day150
1.练习项目 :
问题描述
小薇是一位喜欢解谜题的小姑娘,一天她来到了一座神秘的数字迷宫。
这座数字迷宫是由一个正整数 n 构成的,小薇需要将 n 分解为 3 个各不相同的正整数之和,且每一个正整数都不能包含数字 2 和 4 才能离开迷宫。
小薇很兴奋,但她很快发现这个数字迷宫并不简单,因为要求的是不同的分解方法数。此外,小薇还发现,她可以任意调换三个正整数的顺序,但这并不被算作一种新的分解方法。
这可就难办了,小薇很清楚以她目前的能力是无法完成解谜的离开迷宫的。但好在她是个氪金玩家,通过氪金的力量,她联系上了你。
你能帮小薇计算出不同的分解方法数吗?
输入格式
输入仅一行,包含一个正整数 n(1≤n≤2×104)。
输出格式
输出一个整数,表示将 n 分解为 3 个各不相同的正整数之和,且每个正整数都不包含数字 2 和 4 的方法数。
2.选择课程
在蓝桥云课中选择题库,选择题号2958并开始练习。
3.开始练习
(1)源码:
//由于n的范围是1e4,O(n^2)的规模只有1e8,限时2s,故本题直接暴力求解即可
#include <bits/stdc++.h>
using namespace std;
bool check(int x)//验证x的各位是否含2或4
{
while(x)//拆分x的各位
{
if(x%10==2||x%10==4)return false;//有2或4则返回false
x=x/10;
}
return true;//否则返回true
}
int main()
{
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++)//枚举第一个正整数i
{
if(check(i)==false)continue;//含2或4,返回
for(int j=1;j<=n;j++)//枚举第二个正整数j
{
if(j==i||check(j)==false)continue;//j等于i,或j含2和4,返回
int k=n-i-j;//由i和j直接算出第三个数k
if(check(k)==false||k==i||k==j||k<=0)continue;//同理验证k
ans++;//均满足要求,计数值加1
}
}
//注意本题规定调换3个数的顺序仍算作一种答案
//若一种答案为5 6 7,则以上算法将5 6 7的所有排列均计入其中
//3个数的排列数是A(3,3)=6,故计数值除以6即为最终答案
cout<<ans/6<<endl;
return 0;
}
(2)检验结果
对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。
(3)练习心得:注意每段代码末尾的分号是否存在,如不存在则需即使补充;输入法是否切换 为英语模式;语法是否错误。