我是一个新的C-学习者,试图找到吸血鬼数字从10万到100万。
吸血鬼号码:http://en.wikipedia.org/wiki/Vampire_number
代码已经准备好了,但它并没有按预期工作。它只是继续搜索了很长一段时间,没有打印任何东西,一段时间后打印了大量的数字。我不知道问题出在哪里,这就是代码的样子:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define true 1
#define false 0
int main(void){
int i,j,t,s,m,n,counter=0;
for(i=10; i<100; i++){
m = Control2Digits(i);
if(m == true){
counter++;
printf("%d.Vampire number: %d \n", counter, i);
}
}
for(j=1000; j<10000; j++){
m = Control4Digits(j);
if(m == true){
counter++;
printf("%d.Vampire number: %d \n", counter , j);
}
}
for(t=100000; t<1000000; t++){
for(s=100000; s<1000000; s++){
m = Control6Digits(s,t);
if(m == true){
n = (s*t);
counter++;
printf("%d.Vampire number: %d \n", counter, n);
}
}
}
}
int Control2Digits(int number){
int n1,n2;
n1 = number%10;
n2 = (number-n1)/10;
if(n1*n2 == number)
return true;
return false;
}
int calculate4(int s1, int s2, int s3, int s4){
int p1,p2;
p1 = (s1*10)*s2;
p2 = (s3*10)*s4;
return (p1*p2);
}
int Control4Digits(int number){
int g1,g2;
int t1,t2,t3,t4;
if(number%100 == 0)
return false;
g1 = number/100;
g2 = number%100;
t1 = g1/10;
t2 = g1%10;
t3 = g2/10;
t4 = g2%10;
if(calculate4(t1,t2,t3,t4) == number)
return true;
else if(calculate4(t2,t1,t3,t4) == number)
return true;
else if(calculate4(t2,t1,t4,t3) == number)
return true;
else if(calculate4(t1,t2,t4,t3) == number)
return true;
else if(calculate4(t1,t3,t2,t4) == number)
return true;
else if(calculate4(t3,t1,t2,t4) == number)
return true;
else if(calculate4(t1,t4,t2,t3) == number)
return true;
else if(calculate4(t1,t3,t4,t2) == number)
return true;
else if(calculate4(t4,t1,t2,t3) == number)
return true;
else if(calculate4(t3,t1,t4,t2) == number)
return true;
else if(calculate4(t1,t4,t3,t2) == number)
return true;
else if(calculate4(t4,t1,t3,t2) == number)
return true;
return false;
}
int Control6Digits(int num1, int num2){
long int k,l,m,n,c;
k = num1%10;
l = num2%10;
if(k + l == 0)
return false;
else{
m = (num1*num2);
n = (num1*1000+num2);
if(a == g)
return true;
c = true;
}
return false;
}
最佳答案
啤酒男爵已经指出了你对四位数吸血鬼数字的错误。
六位数的逻辑没有正确实现,也不清楚。(在发布状态下,它不会编译:什么是a
,什么是g
?)如果你遵循四位数代码的逻辑,你必须检查每一个数字的360个组合,这有点多。
另外,我希望您不会感到惊讶,您的代码执行时间如此之长:您有两个从100000到一百万的嵌套循环,即每个循环90万个。这是8100亿次迭代。
你的四位数代码在原则上是有效的,如果你想检查吸血鬼的单个数字是可以的。如果您想识别某个范围内的所有吸血鬼编号,应该使用“扩散”方法:不要从1000到10000之间迭代v = a * b
,而是尝试从10到100之间的a
和b
两个嵌套循环。(b
不必每次从10开始。例如,如果a
是20,那么从50
开始就足够了,因为任何b
较低的产品都有较少的位数。)
(这种方法有点像用埃拉托内斯的筛子来寻找素数。这不一样,因为你还得测试你的嫌疑犯。这个解决方案的一个缺点是,你找不到你的吸血鬼数字的升序。例如,您将在1395 == 15 * 93
之前找到1260 == 21 * 60
。如果必须订购您的号码,请将其存储在数组中,并在打印前对其进行排序。)
你现在必须想出一个有效的方法来比较这些数字。一个简单的解决方案是使用一个数组,每个数字都有计数器。从所有的计数器都等于零开始,加上疑似吸血鬼的数字,减去尖牙的数字,如果你再次得到所有的零,你就找到了吸血鬼的数字。
另一个解决方案是将所谓的吸血鬼编号打印到字符串中,将两个尖牙打印到另一个字符串中,按字符对字符串进行排序并进行比较。
你也可以使用位掩码,但由于数字的计数也必须匹配,因此不足以为某些数字设置位。对于100万以内的数字,可以加8的幂,例如8^3表示数字3
。
我喜欢的一种方法是用素数的乘积来识别数字。你必须小心整数溢出,但对于高达一百万的数字,你是安全的:
typedef unsigned int uint;
uint fact(uint a)
{
static uint primes[10] = {2, 3, 5, 7, 11, 13, 17, 23, 29, 31};
uint r = 1u;
while (a) {
r *= primes[a % 10];
a /= 10;
}
return r;
}
然后你可以像这样测试尖牙和数字:
v = a * b;
if (fact(a) * fact(b) == fact(v)) printf("%u\n", v);
关于c - 查找吸血鬼数量从10到100万,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21582617/