问题描述

1982年,阿尔伯特•Wilansky理海大学的数学家浏览他的电话目录,注意到他妹夫h•史密斯的电话号码有以下特殊属性:这个数字的各位数之和等于其质因数的个位数之和。明白了吗?史密斯的电话号码是493 - 7775。这个数字可以写成其质因数在以下方式下的产物,:
65837 = 3 * 5 * 5 * 65837
数字的总和的电话号码是4 + 9 + 3 + 7 + 7 + 7 + 5 = 42,其质因数各位数字之和同样是3 + 5 + 5 + 6 + 5 + 8 + 3 + 7 = 42。Wilansky非常惊讶于他的发现,他姐夫后命名这种数字:史密斯数字。
作为每一个素数的观察也是如此,Wilansky决定以后,一个古朴的素数是史密斯不值得作为一个数字,所以他将他们排除在定义。
史密斯Wilansky发表了一篇关于数字的两年大学数学杂志和史密斯能够呈现整个集合不同的数字:例如,9985年史密斯是一个数字,所以是6036。然而,史密斯Wilansky无法找到一个数字大于妹夫的电话号码。你的任务是找到比4937775更大的史密斯数字

输入:

输入由一系列正整数组成,每行一个。每个整数最多有8位数。输入0结束。

输出:

对于输入的任何n>0,计算出比n大的最小的Smith number,并且将它另起一行输出(可以假设这个数存在)。

样例输入:

4937774
0
样例输出:
4937775

算法分析

1) 判断是否质数

判断数num是否为整数,只需从2到√num开始,查找是否有能被num整除的数。若有,则返回1,否则返回0。

int isprime(int num)
{int i;for(i=2;i*i<=num;i++){if(num%i==0)return 0;}return 1;
}

2) 计算各位数之和

要求数j的各位数之和,需先将其每位一次取出,每取出一位,就将其加入到sum中去。通过对10求余,取出最后一位,再除以10,将值赋给num,循环此过程,直到num等于0。

int sumofdigits(int j)
{int sum=0;while(j!=0){sum+=j%10;        j=j/10;      }return sum;
}

3) 计算各质因数及其各位数之和

先求数i的各质因数,质因数j从2开始对i求余,若能整除,则通过调用sunofdigits()函数将j的各位数之和加入sum中。并判断i/j是否为质数,若为质数,则通过调用sunofdigits()函数将i/j的各位数之和加入sum,同时退出循环。若不能整除,则将j++,循环上述过程。

int sumofprime(int i)
{int j=2;int sum=0;while(1){if(i%j==0){sum+=sumofdigits(j);if(isprime(i=i/j)) {   sum+=sumofdigits(i);            break;}}elsej++;}return sum;
}

程序流程图


图1 程序主流程图

图2 isprime()函数的流程图

图3 sumofdigits()函数的流程图

图4 sumofdigits()函数的流程图

程序源码

#include<stdio.h>
int isprime(int num)
{
int i;
for(i=2;i*i<=num;i++)
{
if(num%i==0)
return 0;
}
return 1;
}
int sumofdigits(int j)
{
int sum=0;
while(j!=0)
{
sum+=j%10;
j=j/10;
}
return sum;
}
int sumofprime(int i)
{
int j=2;
int sum=0;
while(1){    //合数是一定可以被分解质因数的,所以一直循环好了
if(i%j==0)
{
sum+=sumofdigits(j);
if(isprime(i=i/j))
{
sum+=sumofdigits(i);
break;
}
}
else
j++;
}
return sum;
}int main(void)
{int num;
while (scanf("%d", &num) != EOF && num != 0)
{
int i,flag=0;
for(i=num+1;!flag;i++)
{
if(!isprime(i))    //素数不可能是Smith Number
{
if(sumofprime(i)==sumofdigits(i))
{
printf("%d\n",i);
flag=1;
}
}
}
}
return 0;
}

Smith Numbers相关推荐

  1. Smith Numbers POJ - 1142 (暴力+分治)

    题意:给定一个N,求一个大于N的最小的Smith Numbers,Smith Numbers是一个合数,且分解质因数之后上质因子每一位上的数字之和 等于 其本身每一位数字之和(别的博客偷的题意) 思路 ...

  2. POJ1142 HDU1333 ZOJ1133 Smith Numbers【质因数分解+素数判定+数位之和】

    问题链接:POJ1142 HDU1333 ZOJ1133 Smith Numbers. 题意简述:寻找大于输入数并且最接近的Smith Numbers. 问题分析: Smith Numbers数不是素 ...

  3. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  4. Competitive Programming 3题解

    题目一览: Competitive Programming 3: The New Lower Bound of Programming Contests(1) Competitive Programm ...

  5. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

  6. ICPC程序设计题解书籍系列之八:(美)斯基纳等:《挑战编程-程序设计竞赛训练手册》

    S书<挑战编程--程序设计竞赛训练手册>题目一览 1 Getting Started UVA100 POJ1207 HDU1032 The 3n + 1 problem[水题] - 海岛B ...

  7. 搜索题,留着以后慢慢刷

    转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...

  8. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  9. POJ的题目分类(两个版本)

    版本一: 简单题 1000A+B Problem 1001Exponentiation 1003 Hangover 1004 Financial Management 1005 I Think I N ...

最新文章

  1. push_heap算法 (即满足max-heap条件,最大值在根节点)
  2. JAVA爬虫三大运营商
  3. jenkins+Docker持续化部署(笔记)
  4. Linux内核的Makefile和kconfig解读
  5. 【RS】Local Latent Space Models for Top- N Recommendation-利用局部隐含空间模型进行Top-N推荐...
  6. Yii2 behaviors中verbs access的一些理解
  7. php容器概念,深入thinkphp5.1之Container容器
  8. 【Python实例第4讲】填补缺失值
  9. 记一次YUV图像分析(二)
  10. 计算机网络管理员绩效考核,绩效考核管理系统是如何发挥作用的?
  11. AutoRunner自动化测试工具下载地址及安装步骤-泽众云测试
  12. 偏差-方差分解(转)
  13. 【项目管理/PMP/PMBOK第六版/新考纲】计算题! 项目章程/变更/工作绩效报告/项目范围说明书/工作分解结构WBS/最小浮动时间/挣值分析/采购
  14. 关系网络lbs的应用_基于LBS的陌生人社交APP
  15. 回放线上流量利器-GoReplay
  16. 在单片机C语言中const是什么意思
  17. 《Python程序设计》实验四 Python综合实践实验报告
  18. 备战金9银10,精心整理:38道关于软件测试技术面试题(附带答案)
  19. 民事诉讼和刑事诉讼法知识点整理(1)
  20. android设备udid,Android下获取设备唯一标识(UDID, DeviceID...)

热门文章

  1. 新冠疫情数据统计 蓝桥杯楼赛第二十三期
  2. 蠕虫“艾妮”情况分析和解决方案
  3. 安装 webpack 的各种方法
  4. C语言在字符串中查找字符串
  5. 小程序批量上传图片到七牛
  6. Java如何通过IP获得真实地址
  7. 如何去掉控制台程序的请按任意键继续.....
  8. Procedure execution failed 1449 异常
  9. 使用Python 3和Pygame构建游戏:第4部分
  10. 电子设计教程5:稳压管与保险丝防反接电路