1209. 带分数 刷题笔记

思路 暴力匹配

读入目标数 n

看n是否与a+b/c相等

因为c++里面的除法是整除

我们将 n==a+b/c

转换为 c*n==a*c+b

那么如何获得a,b,c

依题意 a,b,c三个数由1-9九个数字组成

且每个数字只能出现一次

由此 我们可以搜出123456789的全部排列方式

然后 每次将这个九位数分成三部分

例如 a=12,b=4567,c=89

又假如 当前排列为 985476321

获得a=985,b=476,c=321;

或者

a=98,b=5476,c=321;

枚举出所有的分法

同时与目标值匹配即可

若相等 则计数++

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring >

using namespace std;

int n,cnt;

const int N=10;

bool used[N];

int st[N];

int num[10]={1,2,3,4,5,6,7,8,9};

int cal(int i,int j);

void dfss()

{

//双循环 枚举出所有的分法

for(int i=1;i<=6;i++){

for(int j=i+1;j<=8;j++){

int a=cal(1,i);

int b=cal(i+1,j);

int c=cal(j+1,9);

//cout<<a<<endl<<b<<endl<<c<<endl;

if(c*n==a*c+b){

cnt++;

}

}

}

//cout<<dsf(1);

}

void dfs(int u){

if(u>9){

//当u>9说明已经搜索出了一个排列

//修改num内存的值与当前排列相同

int ans=0;

for(int i=1;i<=9;i++){

num[i]=st[i] ;

// cout<<num[i]<<' ';

}

dfss();//计算当前排列是否匹配目标值

return ;

}

for(int i=1;i<=9;i++){

if(!used[i]){

used[i]=true;

st[u]=i;

dfs(u+1);

used[i]=false;

st[u]=0;

}

}

}

int cal(int i,int j){

int res=0;

for( ; i<=j;i++){

res=res*10+num[i];

}

//将num的值转化为a,b,c的值

return res;

}

int main(){

cin>>n;

dfs(1);

cout<<cnt;

return 0;

}

相关推荐
橙河网络3 分钟前
橙河网络:海外问卷安全类问卷调查怎么做?
网络·经验分享·笔记·课程设计
FakeOccupational3 小时前
【树莓派 004】 RP2040 PIO JMP指令 : jmp()条件跳转+jmp 指令的常用条件+示例解释
笔记
狐573 小时前
2026-01-19-LeetCode刷题笔记-1292-元素和小于等于阈值的正方形的最大边长
笔记·算法·leetcode
张祥6422889043 小时前
误差理论与测量平差基础笔记六
笔记·算法·概率论
zpedu3 小时前
软考想一次过,有一个学习衡量标准吗?
人工智能·笔记
孞㐑¥5 小时前
算法—滑动窗口
开发语言·c++·经验分享·笔记·算法
历程里程碑5 小时前
Linux 3 指令(3):进阶指令:文件查看、资源管理、搜索打包压缩详解
linux·运维·服务器·c语言·数据结构·笔记·算法
智者知已应修善业6 小时前
【输出一个N*N的01矩阵,表示最后的汉字点阵图】2024-10-22
c语言·数据结构·c++·经验分享·笔记·算法·矩阵
速冻鱼Kiel6 小时前
Lyra的相机系统
笔记·ue5·游戏引擎·虚幻
鄭郑7 小时前
【Playwright 学习笔记 05】Xpath选择
笔记·学习