带分数

100 可以表示为带分数的形式:100 = 3 + 69258 / 714

还可以表示为:100 = 82 + 3546 / 197

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

题目要求:

从标准输入读入一个正整数N (N<1000*1000)

程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!

例如:

用户输入:

100

程序输出:

11

再例如:

用户输入:

105

程序输出:

6

资源约定:

峰值内存消耗 < 64M

CPU消耗 < 3000ms

思路:dfs全排列 + 筛选数据,这里的筛选数据方法是:枚举两个端点,也就是分成三个区间判断 a + b/c 是否等于 输入的数n。

代码:

#include<iostream>
using namespace std; //dfs搜索全部组合,最后筛选满足条件的组合 int x = 0, count = 0;
int visited[10];
int ans = 0;
int n; //将数组区间转化为数字
int getNum(int list[], int f, int r)
{
int i = 0, num = 0;
for (i = f; i <= r; i++)
num = list[i] + num * 10; //进位
return num;
} //筛选出正确的数据: 划分成三个区间 a + b/c (也就等于枚举两个端点)
int test(int a[]){
int t = 0;
// a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i
//枚举左端点
for(int i=1;i<=x;i++){
double x = 0;
double y = 0;
double z = 0;
//枚举右端点
for(int j=i+1;j<9;j++){
int k1 = i+1;
int k2 = j+1;
//求值
x = getNum(a,1,k1-1);
y = getNum(a,k1,k2-1);
z = getNum(a,k2,9);
if((y/z) + x == n){
t++;
}
}
}
return t;
} //搜索 全排列
void dfs(int k,int a[]){
if(k == 10){
int tt = test(a);
if(tt){
ans+=tt;
}
return;
} for(int i=1;i<=9;i++){
//是否使用i这个数:当没有使用过i这个数的值时 就可以用这个数了
if(!visited[i]){
a[k] = i;
visited[i] = 1; //标记这个数已经用过
dfs(k+1,a);
a[k] = 0; //回溯
visited[i] = 0; //回溯标记这个数没有用过
}
}
} int main(){
cin>>n;
int temp = n;
//统计n总共多少位: 便于dfs的剪枝
while (temp != 0)
{
++x;
temp /= 10;
}
int a[10];
for(int i = 1;i<=9;i++){
visited[i] = 0;
}
dfs(1,a);
cout<<ans<<endl;
}

方法二:用algorithm的全排列函数,自己写字符串截取函数(库函数substr效率很低!开辟字符串,拷贝到新空间)

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <string> using namespace std; int parse(const char *arr, int pos, int len) {
int ans = 0;
int t = 1;
for (int i = pos + len - 1; i >= pos; --i) {
ans += (arr[i] - '0') * t;
t *= 10;
}
return ans;
} int main(int argc, const char *argv[]) {
int n, ans = 0;
scanf("%d", &n);
std::string s = "123456789";
do {
const char *str = s.c_str();
for (int i = 1; i <= 7; ++i) {
// string a = s.substr(0, i);
int inta = parse(str, 0, i);
if (inta >= n)break; for (int j = 1; j <= 9 - i - 1; ++j) {
// string b = s.substr(i, j);
// string c = s.substr(i + j)
// int intb = atoi(b.c_str());
// int intc = atoi(c.c_str());
int intb = parse(str, i, j);
int intc = parse(str, i + j, 9 - i - j);
if (intb % intc == 0 && inta + intb / intc == n)ans++;
}
}
} while (std::next_permutation(s.begin(), s.end()));
printf("%d\n", ans);
return 0;
}

带分数|2013年蓝桥杯B组题解析第九题-fishers的更多相关文章

  1. 第十届蓝桥杯JavaB组省赛真题

    试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...

  2. 黄金连分数|2013年蓝桥杯B组题解析第四题-fishers

    黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜,它首次 ...

  3. 前缀判断|2013年蓝桥杯B组题解析第五题-fishers

    前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 &quo ...

  4. 第十届蓝桥杯JavaC组省赛真题

    试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...

  5. 第四届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学. 一 ...

  6. 第九届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.哪天返回 题目描述 小明被不明势力劫持.后被扔到x星站再无问津.小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文. ...

  7. 第九届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数 ...

  8. 第九届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分数 题目描述 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多 ...

  9. Java实现第十一届蓝桥杯JavaB组 省赛真题

    试题 A: 指数计算 本题总分:5 分 [问题描述] 7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民 走过了 99 年. 请计算:7 ^ 2020 mod 1921,其中 ...

随机推荐

  1. Android HandlerThread 源代码分析

    HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又 ...

  2. ubuntu16 64位 编译64位程序和32位程序

    安装了ubuntu16 64位的系统,想在该环境下用gcc编译64位和32位的程序 默认已经安装了64位环境的gcc 1. 首先确认安装的环境是不是64位的 cocoa@cocoaUKlyn:~/De ...

  3. 微软BI 之SSRS 系列 - 使用文档结构导航报表元素 Document Map

    在 SSRS 中也有类似于 Word 文档中的那种导航的效果 - 左侧部分,可以通过导航地图快速的定位到国家下的省份或者城市,并且这种层次结构是由在创建行分组时定义的. 比如说下面的这个例子中,我分了 ...

  4. C# System.Collections.Stack

    using System; using System.Collections; public class SamplesStack { public static void Main() { // C ...

  5. C++11 正则表达式——基础知识介绍

    C++11开始支持正则表达式,使得处理文本更加简洁方便.C++11 支持六种正则表达式语法:ECMAScript, basic(POSIX Basic Regular Expressions), ex ...

  6. maven项目中利用jmeter-maven-plugin插件直接执行jmeter jmx脚本

    jmeter脚本需要执行脚本,先得下载jmeter并解压jmeter.如想在maven项目中通过mvn install 直接执行jmx文件,这样就能在测试服务器上通过一个命令就能执行下性能测试了,给自 ...

  7. axios的初步使用

    1.数据格式 [ { "title": "喵1", "href": "1", "url": &quo ...

  8. linux每日命令(3):ln命令

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  9. linux每日命令(34):ps命令和pstree命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  10. 【Linux高级驱动】rtc驱动开发

    [1.分层思想] 1.1 rtc-dev.c   //设备接口层,功能:给用户提供接口 subsys_initcall(rtc_init);   , RTC_DEV_MAX, "rtc&qu ...