UVA-725

UVA-725

  1. 题目描述:

输入一个正整数n(2<=n<=79),按照从小到大的顺序输出所有形如abcdefg/fghij = n的表达式,其中a~j 恰好为数字 0~9 的一个排列(可以有前导0)

2.Sample Input:

62

3.Sample Output:

79546/01283 = 62 94736/01528 = 62

思路

这道题的思路并不难,主要就是通过 暴力枚举 的方法

其实需要枚举的数经过我们的设定,完全可以控制在1e8内,可以说是绰绰有余
这道题的本质就是 : 分子/分母 = n
.
首先想到的就是直接分别枚举分子和分母,当他们两个的商等于n时,结束循环,但其实通过简单的运算 , 即 分子 = 分母 * n,会将算法的效率从O(n²) 提高到 O(n)
同时为了避免重复和提高效率,我们将枚举的初始值设为1234(01234)
枚举结束的标志设为98765。
.
主要算法就是避免重复,这里我用自定义的differen()函数,返回值是bool类型。

所用到函数的介绍

1.sprintf

sprintf()函数用于将格式化的数据写入字符串,其原型为:
int sprintf(char *buffer, char * format [, argument, …]);
该函数的主要功能就是:把格式化的数据写入某个字符串缓冲区。

返回值:返回写入的字符总数,当然不包括字符串末尾的解释标志’\0’
int类型

buffer:这个参数从词义上看,buffer是缓冲区的意思,也就是将数据存入的位置

**format:**这个参数就是我们需要的格式化类型,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。

argument: 这个就是用写入的参数替换format标签

2.unique

unique()函数 主要功能: 用于将数组中相邻的重复元素去除
函数原型:iterator unique(iterator it_1,iterator it_2); 这里的iterator可以看作是一个指针类型,但不会在编译时确定地址类型

返回值: 这个函数的返回值是一个iterator,可以看作是一个指针,返回的是经过unique后,不重复的序列的最后一个元素的下一个元素

参数: (iterator it_1,iterator it_2),显然,这两个参数就是需要排序的位置,一般是选择数组的首尾位置。

可能这样讲比较抽象,举个栗子
输入数组 a[]={1,2,3,4,4,5,6,6,6,7,8,6,7,8}。
输出数组 a[]={1,2,3,4,5,6,7,8,6,6,7,8}。
这里并不像大部分所讲的,讲重复的元素后移,更准确的说是讲不重复的数字前移

3.sort函数

函数的主要功能: 将给定的区间进行排序,默认从小到大,也可以用你提供的比较方法cmp(compare)

函数原型 Sort(start,end,cmp)

参数:前两个参数就是需要排序的起始位置和结束位置,第三个参数就是比较方法,可以通过自定义一个函数来改变排序的方式

演示案例

UVA-725_第1张图片

代码实现

#include
#include//sort函数和unique函数要包含这个"算法"头文件
#include//这里用到c语言的输入输出
using namespace std;


bool different(int i, int j)
{
	char s[13] = { 0 };

	//%05d的意思是 凑齐5位,不足的话用0补充,且0会补充在前面
	//如果是%5d 就是凑齐5位,不足的用空格补充,同样空格也会补充在前面
	int len1 =sprintf(s, "%05d%05d", i, j);
	
	//如果超过了10位,就直接返回'假'
	//因为题目要求总共最多10位(0~9的数字)
	if (len1 > 10)
	return false;

	sort(s, s + len1);

	//unique的返回值是 返回容器中最后一个不重复的元素的下一个元素
	//例如: 123455667 经过unique()之后会变成  1234567'6'7 会返回最后一个倒数第二个'6'的地址
	int len2 = unique(s, s + len1) - s ;

	//如果有重复的元素那 len2的长度就会较len1有所缩减
	if (len2 != len1)
		return false;
	else
		return true;
}



int main()
{
	int n, i, j;
	//sacnf/printf 的输入输出效率要高于 cin/cout
	scanf("%d", &n);

	//从1234开始 其实就是从 01234 开始
	//如果从00000到99999就太浪费时间了
	//因为题目要求 分母不能出现重复的数字,也不能大于位
	for (j = 1234; j <= 98765; j++)
	{
		i = j * n;//满足 分子/分母 = n -> 分子 = 分母 * n
		if (different(i, j))
			printf("%d / %d = %d\n", i, j, n);
	}
	
	//防止程序结束,写不写无所谓
	cin.get();
	cin.get();
	return 0;
}

你可能感兴趣的:(数据结构与算法,算法,字符串,c++,c算法,c语言)