K-Smith numbers

medie2005 2008-11-21 01:24:42
Smith number 是自身数字和等于其所有素因子(包含重复)的数字和的合数。
比如:666=2*3*3*37
666的数字和为:6+6+6=18;而666的所有素因子(包含重复)的数字和为:2+3+3+3+7=18,于是,666是一个Smith number。

更奇特的,三个相邻合数73615 ,73616,73617都是Smith number(73615=5*14723 ,73616=(2^4)*43*107,73617=3*53*463)。我们把K个相邻合数都是Smith number的数称为K-Smith numbers ,为了方便,就以第1个合数来表示这K个数。比如,73615 ,73616,73617,表示为3-Smith numbers : 73615。

问题:
1):请求出10^19内的所有Smith number.
2):对1<=i<=8的每个i,请求出i-Smith numbers各一个.
...全文
358 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwei707 2009-04-03
  • 打赏
  • 举报
回复
我正在做TOJ上的做个题
都不知道怎么错了,大牛帮忙看下
#include<stdio.h>
int p[10000];
long int Smith_num[1000];
int s_digit(long n)
{
int sum=0;
while(n)
{
sum+=n%10;
n/=10;
}
return sum;
}
void Prime() {
int n=10000;
int i,j,a[n];
int num = 0;
for(i=0;i<n;i++)
a[i]=0;
for(i = 2; i < n; ++i) {
if(!(a[i]))
p[num++] = i;
for(j = 0; (j<num && i*p[j]<n); ++j) {
a[i*p[j]] = 1;
if(!(i%p[j])) break;
}
}
}
int Smith(long int n)
{
int i,sum=0;
int tep=0;
for(i=0;p[i];i++)
{
while( n%p[i] == 0 )
{
sum+=s_digit(p[i]);
tep++;
n/=p[i];
}
}
if(tep==1&&n==1)
return 0;
if(sum==0)
return 0;
if(n!=1) sum+=s_digit(n);
return sum;
}
int main()
{
int s_digit(long);
int Smith(long);
long int i,n,sum,j;
Prime();
while(scanf("%ld",&n)&&n)
{
for( i=n+1 ; i<99999999 ; i++)
{
if( s_digit(i) == Smith(i) )
{
printf("%d\n",i);
break;
}
}
}
return 0;
}

ahjoe 2008-11-29
  • 打赏
  • 举报
回复
这个 Smith numbers 能给我们的工作或生活带来什么好处吗
liangbch 2008-11-27
  • 打赏
  • 举报
回复
我已经在 http://bbs.emath.ac.cn/viewthread.php?tid=926&page=3 给出源代码。在PIV 2.6G(2004年的主流机型) 计算1亿以内的smith数 需要23秒。详情请见 http://bbs.emath.ac.cn/viewthread.php?tid=926&page=3
liangbch 2008-11-27
  • 打赏
  • 举报
回复
按照现有的速度,求2^12以内的smith数,需要将近3天时间。
liangbch 2008-11-26
  • 打赏
  • 举报
回复
10^19太大了。我现有的算法复杂度 接近O(n),求出所欲10^8以内的smith数耗费时间不超过5秒。等整理下代码后,将准确的性能指标贴出来。
Super.Jiju 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 medie2005 的帖子:]
Smith number 是自身数字和等于其所有素因子(包含重复)的数字和的合数。
比如:666=2*3*3*37
666的数字和为:6+6+6=18;而666的所有素因子(包含重复)的数字和为:2+3+3+3+7=18,于是,666是一个Smith number。

更奇特的,三个相邻合数73615 ,73616,73617都是Smith number(73615=5*14723 ,73616=(2^4)*43*107,73617=3*53*463)。我们把K个相邻合数都是Smith number的数称为K-Smith numbers ,为了方便,就以第1个合…
[/Quote]

poj上面有类似的这道题
eastseek 2008-11-23
  • 打赏
  • 举报
回复

8楼的弟兄,2不是合数,2也是质数啊.
hityct1 2008-11-22
  • 打赏
  • 举报
回复
楼主学数学的?都是这么难的问题。
tuntiankou 2008-11-22
  • 打赏
  • 举报
回复
3-s 也太多了。。最小的是2 然后727 1282
如果限制i-s不能为质数 那么 73615的下一组为209065

LZ还是再限制一下吧
没什么好的思路 再算下去也没意义
4-s 4463535 以后的懒得等了 LZ不要光出题说说你的目的不行么?
WizardOz 2008-11-21
  • 打赏
  • 举报
回复
呵呵,楼主挺猛,天天只研究这类问题。
medie2005 2008-11-21
  • 打赏
  • 举报
回复
呵呵,Smith numbers太多了。
第一问改成:
1):请求出10^12内的所有3-Smith numbers.
tuntiankou 2008-11-21
  • 打赏
  • 举报
回复
.... 37 3+7 素因子也是算数位和的.
绿色夹克衫 2008-11-21
  • 打赏
  • 举报
回复
学习lz上一个素数的贴子的思路

1):请求出10^19内的所有Smith number.

数字和 < 18 * 9 = 162

所以只要有小于162的素数表就可以了,依次求表中所有质数的log。

然后可以按照前段时间一个100元换零钱的帖子里面的方法,把2-162依次分解为若干个质数的和,
剪枝条件为:loga1 * b1 + loga2 * b2 ...... < 19

最后对求出的分解作验证
tuntiankou 2008-11-21
  • 打赏
  • 举报
回复
收回以上发言
tuntiankou 2008-11-21
  • 打赏
  • 举报
回复
路过 楼主的数论贴基本都看过 我想知道的是这个个问题 意义在何处
没接触过数论 甚至是只学过初等数论的人只有一个办法 穷举
那么剩下的就是机器计算能力的比拼
当然手头有一个足够大的素数表会方便许多 起码分解时会方便得多
没别的意思就是想知道楼主的目的是什么?
oo 2008-11-21
  • 打赏
  • 举报
回复
up

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧