UVA-725
- 题目描述:
输入一个正整数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)
参数:前两个参数就是需要排序的起始位置和结束位置,第三个参数就是比较方法,可以通过自定义一个函数来改变排序的方式
演示案例
代码实现
#include<iostream>
#include<algorithm>//sort函数和unique函数要包含这个"算法"头文件
#include<cstdio>//这里用到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;
}