首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

查找恶魔数字的算法有关问题

2012-03-25 
查找恶魔数字的算法问题查找1000000以内恶魔数字,7是一个恶魔数字,如果一个数是7的倍数,或者它的数位上含

查找恶魔数字的算法问题
查找1000000以内恶魔数字,7是一个恶魔数字,如果一个数是7的倍数,或者它的数位上含有数字7,那么这个数也是恶魔数字。

**********************************************************************************************************
以下参考代码,如果是1000000的话,这个算法不是很好,还有更好的算法吗?
**********************************************************************************************************

C/C++ code
#include <iostream>using namespace std;//判断是否是7的倍数 bool IsDivision(const int n,const int m =7){  return !(n%m);}//判断整数n中是否含有7 bool IsContain(const int n,const int m =7){     int temp = n;     while(temp)     {        if( m == temp%10)           return true;        else          temp /= 10;     }     return false;}int main(){  int n;  cout<<"Enter n:"<<endl;  cin>>n;  for(int i=7;i<=n;++i)  {     if(IsDivision(i) || IsContain(i))       cout<<i<<endl;  }  system("pause");  return 0;}


[解决办法]
bool IsContain(const int n,const int m =7)
给点意见
可以用itoa函数
把n转换成字符串,然后扫描字符串是否包含m即可
取模运算效率不是很好
[解决办法]
探讨

bool IsContain(const int n,const int m =7)
给点意见
可以用itoa函数
把n转换成字符串,然后扫描字符串是否包含m即可
取模运算效率不是很好

[解决办法]
探讨

引用:
引用:

bool IsContain(const int n,const int m =7)
给点意见
可以用itoa函数
把n转换成字符串,然后扫描字符串是否包含m即可
取模运算效率不是很好

我觉得每次都把数字转为字符串也很麻烦的,而且效率不高

我也觉得咯····不知itoa和取模运算怎……

[解决办法]
Python code
#include <stdio.h>#include <stdlib.h>#include <string.h>int is_evil(int n){#define STR_LEN 8        static char str_n[STR_LEN];#undef STR_LEN        if (n >= 0 && n <= 1000000)        {                if (n % 7 == 0)                {                        return 1;                }                sprintf(str_n, "%d", n);                char *pos = strchr(str_n, '7');                if (pos != NULL)                {                        return 1;                }                return 0;        }        return -1; //out of range}int main(){        for (int i = 0; i <= 1000000; ++ i)        {                if (is_evil(i) == 1)                {                        printf("%d is evil\n", i);                }        }        return 0;}
[解决办法]
我觉得不能这样求解。
应该先分析。
比如 N 以内那些数字的数位有 7 ,这些是固定的。
那些是 7 的倍数,可以直接 + 求解。
滤去相同的就可以了。

不要把什么都交给计算机。
应该先有数学分析。
[解决办法]
探讨

引用:
我觉得不能这样求解。
应该先分析。
比如 N 以内那些数字的数位有 7 ,这些是固定的。
那些是 7 的倍数,可以直接 + 求解。
滤去相同的就可以了。

不要把什么都交给计算机。
应该先有数学分析。

我也有这种想法,但不知怎样实现

[解决办法]
探讨

Python code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int is_evil(int n)
{
#define STR_LEN 8
static char str_n[STR_LEN];
#undef STR_LEN

if (n >= 0 &amp;&amp; n <= ……

------解决方案--------------------


#include"stdio.h"
char a[7] = "0000000";
void seven(int i)
{
if(a[i]+1>'9')
{
seven(i-1);
a[i] = '0';
}
else
{
a[i] = a[i] + 1;
}
}
void outPrint()
{
int i ;
int j ;
for( i = 0 ; i <= 6 ; i++)
{
if(a[i]!='0')
{
for(j = i ; j < 7 ; j++)
{
printf("%c",a[j]);
}
break;
}
}
printf("\n");
}
int se()
{
int j = 0 ;
for(j = 0 ; j < 6 ; j++)
{
if(a[j]=='7')
{
return 1;
}
}
return 0;
}
int main()
{
int num = 0;
while(1)
{
num++;
if(a[6]<'9')
{
a[6] = a[6] + 1;
}
else
{
seven(5);
a[6] = '0';
}
if(a[0]=='1')
{
break;
}
if(num==7||se())
{
outPrint();
}
num = num==7?0:num;
}
}

热点排行