POJ1142 Smith Numbers(數論,分治+暴力,質因數分解)
Description
While skimming his phone directory in 1982, Albert Wilansky, a
mathematician of Lehigh University,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: 4937775= 3*5*5*65837The sum of all digits of the telephone number is 4+9+3+7+7+7+5= 42,and
the sum of the digits of its prime factors is equally
3+5+5+6+5+8+3+7=42. Wilansky was so amazed by his discovery that he
named this kind of numbers after his brother-in-law: Smith numbers.
As this observation is also true for every prime number, Wilansky
decided later that a (simple and unsophisticated) prime number is not
worth being a Smith number, so he excluded them from the definition.
Wilansky published an article about Smith numbers in the Two Year
College Mathematics Journal and was able to present a whole collection
of different Smith numbers: For example, 9985 is a Smith number and so
is 6036. However,Wilansky was not able to find a Smith number that was
larger than the telephone number of his brother-in-law. It is your
task to find Smith numbers that are larger than 4937775!
Input
The input file consists of a sequence of positive integers, one
integer per line. Each integer will have at most 8 digits. The input
is terminated by a line containing the number 0.
Output
For every number n > 0 in the input, you are to compute the smallest
Smith number which is larger than n,and print it on a line by itself.
You can assume that such a number exists.
Sample Input
4937774
0
Sample Output
4937775
思路
首先題目定義了一個史密斯數,這個數的定義是:
- 一個合數的各個位置上加起來的和等於它的素因數所有位置上的數字加起來的和。
比如:
題目讓你找出比n大的數中最小的這個數。另外:素數不是史密斯數
直接暴力就好,利用遞迴。
程式碼
#include <cstdio>
#include <cstring>
#include <cctype>
#include <stdlib.h>
#include <string>
#include <map>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define inf 1000000
#define mem(a,b) memset(a,b,sizeof(a))
bool isprime(int x)
{
int m=(int)(sqrt((double)x)+0.5);
for(int i=2; i<=m; i++)
if(x%i==0)
return false;
return true;
}
int get_digit_sum(int x)
{
int ans=0;
while(x)
{
ans+=x%10;
x/=10;
}
return ans;
}
int cut(int x)
{
if(isprime(x))
return get_digit_sum(x);
int m=(int)(sqrt((double)x)+0.5);
for(int i=m; i>=2; i--)
if(x%i==0)
return cut(i)+cut(x/i);
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
while(n++)
{
if(!isprime(n)&&cut(n)==get_digit_sum(n))
break;
}
printf("%d\n",n);
}
return 0;
}
相關文章
- 階乘質因數分解
- UVA 10892 LCM Cardinality (分解因數+暴力)
- Codeforces 893E Counting Arrays:dp + 線性篩 + 分解質因數 + 組合數結論
- 藍橋杯題庫 BASIC-16 分解質因數
- 質數判斷、質因子分解、質數篩
- python將輸入的一個正整數分解質因數(map)Python
- 大質數分解模板
- HDU 4135 Co-prime(容斥原理+分解質因數)
- Java分解質因數,如輸入8,輸出8=2*2*2Java
- HDU 1299 Diophantus of Alexandria (公式變形 分解質因數)公式
- 求最大質因數
- P1075 [NOIP2012 普及組] 質因數分解
- 【快速因數分解】Pollard's Rho 演算法演算法
- 數論學習筆記 (3):因數與倍數筆記
- [暴力 Trick] 根號分治
- C# 輸入一個整數,求質因數C#
- 數論學習筆記 (2):質數筆記
- 分解質因數——MOOC《零基礎學Java語言》第7周程式設計題1Java程式設計
- 醜數,即只包含質因數 2、3 和 5 的正整數。
- 南沙信奧塞陳老師解一本通題:2032:【例4.18】分解質因數
- 因數分解演算法、週期查詢演算法(簡化)演算法
- 微課|中學生可以這樣學Python(例6.4):因數分解Python
- POJ 2773 Happy 2006 (分解質因數+容斥+二分 或 歐幾里德演算法應用)APP演算法
- 挖坑填數+分治法:快速排序排序
- 數論——數論分塊
- 《整數分解》讀書筆記筆記
- 分治演算法-眾數問題演算法
- 質數與約數
- React數字滾動元件 numbers-scrollReact元件
- HDU 4497GCD and LCM(素數分解)GC
- 數論
- 演算法設計--眾數和重數問題(分治法)演算法
- smith chartMIT
- 【數位dp】Beautiful numbers CodeForces - 55D
- 質數篩
- Find Terrorists(素數篩選+素因子分解)Error
- 數學——數論/雜項
- 【數論】素數篩法