查找恶魔数字的算法问题
查找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即可
取模运算效率不是很好
[解决办法]
[解决办法]
[解决办法]
- 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 的倍数,可以直接 + 求解。
滤去相同的就可以了。
不要把什么都交给计算机。
应该先有数学分析。
[解决办法]
[解决办法]
------解决方案--------------------
#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;
}
}