带分数

题目

带分数
问题描述
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 ;
}
posted @ 2021-07-30 22:02  柏阳光菜菜  阅读(275)  评论(0)    收藏  举报