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 usedN;

int stN;

int num10={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++){

numi=sti ;

// cout<<numi<<' ';

}

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

return ;

}

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

if(!usedi){

usedi=true;

stu=i;

dfs(u+1);

usedi=false;

stu=0;

}

}

}

int cal(int i,int j){

int res=0;

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

res=res*10+numi;

}

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

return res;

}

int main(){

cin>>n;

dfs(1);

cout<<cnt;

return 0;

}

相关推荐
ouynagda7 小时前
HTTP协议与Socket网络编程笔记
网络·笔记·http
摇滚侠7 小时前
《SpringBoot 3:入门与应用实战》第 10 章 REST 服务请求与调用 Reactor 与 WebFlux 笔记 28
spring boot·笔记·后端
幸运小圣8 小时前
JavaScript 关键字与保留字学习笔记详细讲解,一篇get ✅【JavaScript查缺补漏】
javascript·笔记·学习
十铭忘8 小时前
英语介词怎么理解?
笔记
STQY燊桐启元(深圳)电子科技9 小时前
太阳能追踪设备散热优化,相变陶瓷片解决全日照高温积温故障
经验分享·笔记·pcm
️学习的小王10 小时前
Flask实现云栖笔记|开箱即用网页版本地笔记本
笔记·python·flask
chnyi6_ya10 小时前
论文阅读笔记 | Agent0-VL:把工具用进“自我评估“,让视觉语言智能体零外部奖励地自我进化
论文阅读·笔记
M78佐菲10 小时前
Linux学习笔记:网络通信
linux·笔记·学习·算法
西峰u11 小时前
Java IO 完整学习笔记|字节流、字符流、缓冲流、资源关闭全梳理
java·笔记·学习
星恒随风11 小时前
C++11详解(一):统一初始化——列表初始化与 initializer_list
c++·笔记·学习·list·状态模式