蓝桥杯 历届真题 带分数(STL)

  历届试题 带分数  
时间限制: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
//严重吐槽,一开始以为是计算机的整除,以为自己错了,看了别人博客,才。。。。

//调函数的时间是312ms

#include
#include
#include
using namespace std;

int n;
int a[]={1,2,3,4,5,6,7,8,9};

int sum(int left,int right)
{
	int total=0;
	for(int i=left; i<=right; i++)
	{
		total=total*10+a[i];
	}
	return total;
} 
int solve(int num)
{
	int ans=0;
	int f=0,i=0,b,c;
	f=sum(0,num-1);
	if(f>n)
		return 0;
	for(int j=num; j<8; j++)
	{
		i=num,b=0,c=0;
		b=sum(i,j);
		c=sum(j+1,8);
		if(b%c==0 && f+b/c==n)
			ans++;
	}
	return ans;
}
int main()
{
	int ansm=0;
    scanf("%d",&n);
   	do
    {
    	for(int i=1; i<9; i++)
    	{
    		ansm+=solve(i);
    	}
    }while(next_permutation(a,a+9));
    printf("%d\n",ansm);
    return 0;
}
//不调函数的时间252ms
 
#include
#include
#include
using namespace std;

int n;
int a[]={1,2,3,4,5,6,7,8,9};

int solve(int num)
{
	int ans=0;
	int f=0,i=0,b,c;
	while(in)
		return 0;
	for(int j=num; j<8; j++)
	{
		i=num,b=0,c=0;
		while(i<=j)
		{
			b=b*10+a[i];
			i++;
		}
		while(i<9)
		{
			c=c*10+a[i];
			i++;
		}
		if(b%c==0  && c!=0 && f+b/c==n)
			ans++;
	}
	return ans;
}
int main()
{
	int ansm=0;
    scanf("%d",&n);
   	do
    {
    	for(int i=1; i<9; i++)
    	{
    		ansm+=solve(i);
    	}
    }while(next_permutation(a,a+9));
    printf("%d\n",ansm);
    return 0;
}//ac

你可能感兴趣的:(STL,蓝桥杯)