基础算法题——带分数(全排列,工具库)

前言
这道题理解起来不难,但是要找到一个合适的方法对题目进行优化,就会相对麻烦些。
蓝桥杯的题,真的到处都是坑的感觉。。。

带分数题目

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6


题目分析

①、带分数中,数字1~9分别出现且只出现一次(不包含0)。
②、100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

解题思路

①:如何实现在带分数中,数字1~9分别出现且只出现一次。我们可以考虑全排列,将每种排列都来一遍(感觉挺麻烦的,如果有更好的方法欢迎留言讨论)。
②:在例子中 100 = 3 + 69258 / 714,“3 + 69258 / 714”部分要符合数字1~9分别出现且只出现一次,这时可以用到我们字符串截取。拿上面的例子说,排列为369258714,我们截取了字符串3、字符串69258、字符串714,然后将三个字符串转换为int类型变量,看看是否符合条件(100 = 3 + 69258 / 714)符合则记录下来。

实用工具功能及使用
实现全排列:next_permutation(s.begin(), s.end());

在C++中,在字符串要有序的前提下,我们能使用现成的函数完成字符串的全排列。例如:string s=“123456789”;,字符串s已经有序。通过 while(next_permutation(s.begin(), s.end())); 不断将s进行全排序,当s的全排序全部排完后,跳出循环。可能你会觉得这个有什么用?让我们带着这个问题看看代码设计吧!

string s="123456789";
do
{
   
	....
}
while(next_permutation(s.begin(), s.end()));

我们这里用do-while的循环体,保证s每进行一次全排列就会先进行do包含的语句。

实现字符串截取:string a = s.substr(i,len);

在s字符串中,从下标为i的位置,向右截取len长度的字符串,得到a字符串。

实现字符串转换为int类型变量:int a = atoi(s.c_str);

将字符串s转换为int类型变量a。


代码实现
代码一

通过我们的解题思路和工具结合,我们可以得到以下代码一。

//全排列 next_permutation(s.begin(),s.end())
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
#define ll long long
ll ans=0;

int main()
{
   
//	clock_t start, finish;
//	start = clock();
	int n;
	string s="123456789";
//	sort(s,s+9);
	cin>>n;
	
	do
	{
   
		for(int i=1; i<=7; i++)
		{
   
			string a=s.substr(0,i);
			int inta
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值