带分数
题目
带分数
问题描述
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全部都要出现且不能重复且符合算法 x = a + b/c;
这是坑,也是难点。
说实话,我前面是看懂题目了,知道要for循环去执行,但是我跳不过怎么确保每个数都是不一样的且1~9要全部出现?
这真的难倒我了,然后我就去看了其他博主的解题方法,研究了一个小时才看懂(气哭)
具体思路看这位博主的
然后在看看我的理解
第一步,先创建一个数组s[9];里面存放九位数分别是1~9;然后后期调用的时候直接拿就好了
int s[9] = {1,2,3,4,5,6,7,8,9};
第二步,用第一个for循环算出a的值
如果a是一位数,那么b和c就只剩8位数可以取,如果a是两位数,那么b和c就只剩7位数可以取,以此类推
而a = a*10 + s [i];就是为了算出a 是几位数,且s [i]一旦被使用,后面的值都不能用s[i],必须得进一位变成s[i+1];
而i <6是因为0~6一共有七位数,而b和c(分子分母)至少需要一位数
for(int i = 0 ;i<6;i++){
a = 10 * a + s[i];
}
第二步,再用第二个for循环去算出 b 的值,原理和 a 一样
for(int j = i+1;j<8;j++){
b = 10 * b + s[j];
}
第三步,最后用一个for循环算出 c 的值,原理同上
for(int k = j+1;k<=8;k++){
c = 10 * c + s [k];
w = b%c;
}
然后这里我使用w记住b%c的结果,方便下面if语句的比较(可有可无)
最后一步,就是判断是否符合算法条件,如果符合算法条件,sum 就 + 1;如果不符合算法条件,就再回去循环,直到循环结束,然后输出sum;
if(w== 0){
if(a + b/c == N){
sum ++;
}
}
完整代码如下
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
void main(){
int N;
cin>>N;
int w;
int sum = 0;
int s[9] = {1,2,3,4,5,6,7,8,9};
do{
long a = 0;
long b = 0;
long c = 0;
for(int i = 0 ;i<6;i++){
a = 10 * a + s[i];
int b = 0;
for(int j = i+1;j<8;j++){
b = 10 * b + s[j];
int c = 0;
for(int k = j+1;k<=8;k++){
c = 10 * c + s [k];
w = b%c;
}
if(w== 0){
if(a + b/c == N){
sum ++;
}
}
}
}
}while(next_permutation(s,s+9));
cout<<sum;
return ;
}