Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 检查数字重复数字的最快方法是什么?_Algorithm_Numbers - Fatal编程技术网

Algorithm 检查数字重复数字的最快方法是什么?

Algorithm 检查数字重复数字的最快方法是什么?,algorithm,numbers,Algorithm,Numbers,假设我想检查n=123的数字是否有重复的数字。我试过: #include <iostream> using namespace std; int main() { int n = 123; int d1 = n % 10; int d2 = ( n / 10 ) % 10; int d3 = ( n / 100 ) % 10; if( d1 != d2 && d1 != d3 && d2 != d3 ) {

假设我想检查n=123的数字是否有重复的数字。我试过:

#include <iostream>

using namespace std;

int main() {
    int n = 123;
    int d1 = n % 10;
    int d2 = ( n / 10 ) % 10;
    int d3 = ( n / 100 ) % 10;
    if( d1 != d2 && d1 != d3 && d2 != d3 ) {
        cout << n << " does not have duplicate digits.\n";
    }
}
#包括
使用名称空间std;
int main(){
int n=123;
int d1=n%10;
int d2=(n/10)%10;
int d3=(n/100)%10;
如果(d1!=d2&&d1!=d3&&d2!=d3){
cout不一定快,但无论如何你都应该测量,以防万一-我的优化咒语是“测量,不要猜测”

但我相信它的意图更明确(并且足够简单,可以转换成更简单的计算器语言。它还能够处理任意大小的整数

int hasDupes(无符号int n){
//指示数字已被使用的标志,所有零开始。
int使用[10]={0};
//超过10位的数字必须有重复项,请快速返回true。
如果(n>9999999)返回1;
//处理数字中的每个数字。
而(n!=0){
//如果重复,则在找到后立即返回true。
如果(使用[n%10])返回1;
//否则,标记已使用,转到下一位。
使用的[n%10]=1;
n/=10;
}
//检查所有数字后无重复项,返回false。
返回0;
}

如果您的可能性范围有限,您可以使用由来已久的以空间换取时间的方法。例如,假设您谈论的数字介于0和999之间(包括0和999之间)(
::
标记仅表示我已删除的数据,以保持答案的大小可控):

只需对hasDupes[n]进行一次表格查找。表格本身可以通过编程方式生成(一次),然后插入到代码中供使用

但是,根据您的编辑,您需要处理九位数,在您的计算器上可能不可能使用十亿元素数组。因此,我会选择第一种解决方案。

模板
template<class T, int radix = 10>
bool has_duplicate_digits(T n) {
    int digits_mask = 0;
    while (digits_mask |= (1 << (n % radix)), n /= radix)
        if (digits_mask & (1 << (n % radix)))
            return true;
    return false;
}
布尔有重复的数字(tn){ 整数位数\u掩码=0;
而(数字|掩码|=(1我参加了TI-89基础速成班来回答:)

让我们看看这是否有效(我没有模拟器,所以无法检查)


由于您的解决方案仅限于三位数字,因此只需创建一个包含重复数字的数字的哈希表,并检查其中是否包含数字。您还需要处理少于三位的数字(如果这是有效输入)。此时
n=1
将被拒绝,因为其中包含重复数字(前导零)。你在TI-89上使用哪种语言?@belisarius:它不是真正的语言。它只是用来解决数学问题的。因此它没有数组。只有
for
if else
do
while
和算术。@Chan检查一下这篇文章,了解TI-89上的语言建议,谢谢你的解决方案。但是我用C++来描述这个问题。我必须在Ti-89To中编程,所以我正在寻找一种更快的方法。Chan,这个版本的优点是一旦找到一个副本就可以很早就退出。它值得一看。它也有数字数字的优势。(虽然在这种情况下它是最佳的,但只要有超过十个数字,它就应该返回false:pidgeons和holes)我不知道这是否正确,但是使用TI basic时+1:p
B-C->B
看起来很可疑。@pst我同意,但我通过示例学习了。请参阅这里的第一块代码示例:)我的意思是,对于数字倾斜,我预期会出现
B/10->B
或类似情况。@pst需要比我更多的语言算术知识!你怎么知道它将返回一个整数?
template<class T, int radix = 10>
bool has_duplicate_digits(T n) {
    int digits_mask = 0;
    while (digits_mask |= (1 << (n % radix)), n /= radix)
        if (digits_mask & (1 << (n % radix)))
            return true;
    return false;
}
Test()
Prgm
{0,0,0,0,0,0,0,0,0,0}->A
Title "Request"
Request "Enter a number",B
EndDlog
Expr(B)->B
While  B > 1
 MOD(10,B)->C
 if A[C+1] = 1 goto K 
 1->A[C+1]
 B-C->B 
EndWhile
Title "Done"
Text "Numbers non repeating"
Enddlog
goto J

Lbl K
Title "Done"
Text "Numbers repeating"
Enddlog

Lbl J
EndPrgm