簡單枚舉

1.除法

輸入正整數n,按從小到大的順序輸出所有形如abcde/fghij=n的表達式,a~j恰好爲數字0~9的一個排列 ,2<= n <= 79.

#include<cstdio>
#include<cstring>
int vis[10], a[10], n;
void dfs(int x)
{
	if(x > 4)
	{
		int sum =0;
		int i=0;
		for(i=4; i>=0; i--)
			sum = sum*10 + a[i];
		int tmp=sum*n;
		if(tmp >=100000)return;
		for(i=5; i<10; i++)
		{
			a[i]=tmp%10;
			tmp/=10;
		}
		for(i=0; i<9; i++)
			for(int j=i+1;j<10;j++)
				if(a[i] == a[j])
					return;			
		for(i=9;i>=0;i--)
		{
			printf("%d",a[i]);
			if(i==5)
				printf("/");
		}
		printf("=%d\n",n);
		return;
	}
	for(int i=0; i<10;i++)
		if(!vis[i])
		{
			vis[i]=1;
			a[4-x] = i;
			dfs(x+1);
			vis[i] = 0;
		}
}
int main()
{
	while(scanf("%d", &n) != EOF)
	{
		memset(vis, 0, sizeof(vis));
		dfs(0);
	}
	return 0;
}



2.最大乘積

輸入n格元素組成的序列S,你需要找到一個乘積最大的連續子序列。如果這個最大的乘積不是正數,應輸出-1(表示無解)。1<=n<=18, -10 <= Si <= 10

#include<cstdio>
#include<climits>
int a[20];
int main()
{
	int n;
	while(scanf("%d",&n) != EOF)
	{
		for(int m=0; m<n;m++)
		{
			scanf("%d",&a[m]);
		}
		long long  max=LLONG_MIN;
		long long  sum=1;
		int l,i,j,k;
		for(l=1;l<=n;l++)
		{
			for(i=0;i<=n-l;i++)
			{
				j=i+l;
				for(k=i;k<j;k++)
					sum = sum*a[k];
				if(sum > max)
					max=sum;
				sum=1;
			}
		}
		if(max>=0)
			printf("%lld\n",max);
		else
			printf("-1\n");
	}
	return 0;
}



3.分數拆分

輸入正整數k,找到所有的正整數x>=y,使得 1/k = 1/x + 1/y。

#include<cstdio>
int main()
{
	int k;
	int y,x;
	while(scanf("%d", &k) !=EOF)
	{
		int count=0;
		for(y=k+1; y<= 2*k; y++)
		{
			x=(k*y)/(y-k);
			if(x*(y-k) == k*y && x>=y)
				count++;
		}
		printf("%d\n",count);
		for(y=k+1; y<= 2*k; y++)
		{
			x=(k*y)/(y-k);
			if(x*(y-k) == k*y && x>=y)
				printf("1/%d=1/%d + 1/%d\n",k,x,y);
		}
	}
	return 0;
}


發佈了59 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章