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;
}
相關文章
- 階乘質因數分解
- 分解質因數的誤區
- Just for fun——分解一個正整數的質因數
- 【hdu】口算訓練/二分/質因數分解
- hdu 5698 瞬間移動 【質因數分解求組合數】
- python將輸入的一個正整數分解質因數(map)Python
- 第六章 數學問題 -------- 6.12 素數及質因數分解
- P1075 [NOIP2012 普及組] 質因數分解
- HDU 4135 Co-prime(容斥原理+分解質因數)
- 藍橋杯題庫 BASIC-16 分解質因數
- 質數判斷、質因子分解、質數篩
- 大質數分解模板
- Java分解質因數,如輸入8,輸出8=2*2*2Java
- 求最大質因數
- 初等數論-01-整數的因子分解
- 第七章:因數分解與算數基本定理(1)
- 第七章:因數分解與算數基本定理(2)
- 【快速因數分解】Pollard's Rho 演算法演算法
- 數論——質數與約數
- 數論學習筆記 (3):因數與倍數筆記
- [暴力 Trick] 根號分治
- 南沙信奧塞陳老師解一本通題:2032:【例4.18】分解質因數
- 分解質因數——MOOC《零基礎學Java語言》第7周程式設計題1Java程式設計
- C# 輸入一個整數,求質因數C#
- 數論學習筆記 (2):質數筆記
- 醜數,即只包含質因數 2、3 和 5 的正整數。
- 數論概論中的費馬降階法求一個質數分解成2個數的平方和與窮舉法的效率比較
- 微課|中學生可以這樣學Python(例6.4):因數分解Python
- 因數分解演算法、週期查詢演算法(簡化)演算法
- Sum of Square Numbers 平方數之和
- Self Dividing Numbers 自除數
- B - Make Numbers Gym - 102835B(表示式,暴力)
- 整數因子分解問題
- POJ3252Round Numbers(數位dp)
- 挖坑填數+分治法:快速排序排序
- LeetCode169求眾數——分治LeetCode
- 1366: 分解質因子
- 數論——數論分塊
- LeetCode2: Add two numbers(兩數相加)LeetCode