Algorithm 检查数字重复数字的最快方法是什么?
假设我想检查n=123的数字是否有重复的数字。我试过: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 ) {
#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:pB-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