Smith Numbers - PC110706
来源:互联网 发布:越南旅游 知乎 编辑:程序博客网 时间:2024/04/30 08:56
欢迎访问我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/uva10042.html
原创:Smith Numbers - PC110706
作者:MilkCu
题目描述
Smith Numbers
While skimming his phone directory in 1982, mathematician Albert Wilansky noticed that the telephone number of his brother-in-law H. Smith had the following peculiar property: The sum of the digits of that number was equal to the sum of the digits of the prime factors of that number. Got it? Smith's telephone number was 493-7775. This number can be written as the product of its prime factors in the following way:
As this property is true for every prime number, Wilansky excluded them from the definition. Other Smith numbers include 6,036 and 9,985.
Wilansky was not able to find a Smith number which was larger than the telephone number of his brother-in-law. Can you help him out?
Input
The input consists of several test cases, the number of which you are given in the first line of the input. Each test case consists of one line containing a single positive integer smaller than 109.Output
For every input value n, compute the smallest Smith number which is larger than n and print it on a single line. You can assume that such a number exists.Sample Input
14937774
Sample Output
4937775
解题思路
如何找出素因子呢?枚举法。
那每个整数的素因子是否唯一呢?
由算术基本定理可得,每个整数表示成素数乘积的方式只有一种。
Smith数肯定是合数,且满足各个数字之和等于所有素因子的每个数字之和。
注意,素因子中可能出现两个相同的数字。
那样就可以按部就班的做,从给定的数开始遍历,找到满足的数就退出循环。
为什么会超时呢?构建一个装有素数的容器。
为什么答案错误呢?
注意:若临时变量tc不为1,则说明它超出了sqrt(1e9)的范围,但它是质数,仍是该整数的质因子。
代码实现
#include <iostream>#include <cmath>#include <vector>#include <algorithm>using namespace std;vector<int> v;int isPrime(int x) {if(x == 2) {return 1;}int s = ceil(sqrt(x));for(int i = 2; i <= s; i++) {if(x % i == 0) {return 0;}}return 1;}void getPrime(void) {int s = ceil(sqrt(1e9));for(int i = 2; i <= s; i++) {if(isPrime(i)) {v.push_back(i);}}}int calc(int x) {int sum = 0;while(x) {sum += x % 10;x /= 10;}return sum;}int smith(int n) {int current = n + 1;while(1) {//if(find(v.begin(), v.end(), current) != v.end()) {if(isPrime(current)) {//zhishucurrent++;continue;}int csum = calc(current);int tc = current;int tsum = 0;for(int i = 0; i < v.size(); i++) {while(tc % v[i] == 0) {//cout << tc << " " << v[i] << endl;tc /= v[i];tsum += calc(v[i]);}}if(tc != 1) {tsum += calc(tc); //注意!! }//cout << current << " " << csum << " " << tsum << endl;if(tsum == csum) {return current;}//break;current++;}}void print(int x) {cout << x << " ";}int main(void) {//cout << isPrime(4937775) << endl;//cout << calc(4937775) << endl;int m;getPrime();//for_each(v.begin(), v.end(), print);//cout << endl;cin >> m;while(m--) {int n;cin >> n;cout << smith(n) << endl;}return 0;}
(全文完)
本文地址:http://blog.csdn.net/milkcu/article/details/23607205
- Smith Numbers - PC110706
- PC110706 Smith Number //数论 枚举
- Smith Numbers
- Smith Numbers
- Smith Numbers
- POJ 1142 Smith Numbers
- 1027: Smith Numbers
- zoj 1133 Smith Numbers
- zoj 1133 - Smith Numbers
- uva 10042 smith numbers
- POJ 1142 Smith Numbers
- poj 1142 Smith Numbers
- Smith Numbers hdu1333 素数
- poj 1142 Smith Numbers
- Poj 1142 Smith Numbers
- hdu1333/poj1142-Smith Numbers
- poj 1142 Smith Numbers
- 110706 Smith Numbers
- QT信号和槽机制
- 延时程序
- 2013蓝桥杯预赛之翻硬币
- 黑马程序员—Java多线程
- MFC按钮贴图碰到的问题
- Smith Numbers - PC110706
- 正则表达式的基本知识
- ORACLE创建用户及授权
- 设计模式之抽象工厂
- Struts2的dispatcher,chain,redirect和redirectAction的区别
- 现有的人脸数据库介绍及下载链接
- andorid实例源码地址分享(一)
- 编程之美资格赛 大神与三位小伙伴
- 设置分割窗口背景色的简单方法