历届试题 带分数

本文探讨了如何使用1到9的数字不重复不遗漏地构成带分数来表示特定整数的方法,并通过示例展示了针对数字100存在11种不同的表示方式。文章还提供了用于计算此类表示法数量的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

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
 
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
	int n, ans, a, b, c, d, i, x, y, w;
	int prem[9] = {1,2,3,4,5,6,7,8,9};
	int pow10[] = {1,10,100,1000,10000,100000,1000000};
	cin >> n;
	ans = 0;
    do{
    	d = 0;
    	for(i=0; i<9; i++)
    	{
    		d *= 10;
    		d += prem[i];
    	}
    	x = 100000000;
    	w = 9;
    	a = d / x;
    	while(a<=n)
    	{
    		
    		y =  pow10[w/2];
			//cout<<y<<endl;
    		while(true)
    		{
    		
    			if(y==1)break;
    			b = d%x/y;
    			c = d%y;
    			if(b%c==0 && a + b / c == n)
    			{
    				//cout << a << b << c <<endl;
    				ans++;
    			}
				y /= 10;
    		}
    		x /= 10;
    		w--;
    		a = d/x;
    	}
    }while(next_permutation(prem, prem+9));
    cout << ans << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值