これは、素因数分解の問題です:
後で使用するために素数までの1.まず、印刷リスト入力数がlong int型(すなわち唯一のint型である)であるため、素数テーブルの大きさは、あなたができる10 ^ 5レベルであり、21億の最大サイズ(10 ^ 10オーダー)ここで我々は唯一の首相にライン上のsqrtの範囲(10 ^ 10)= 10 ^ 5を必要とします
(2ルートモジュロNこうして又はスクリーニング方法を用いて)、以下のスクリーニング方法において使用される直接I素数テーブルを印刷することができます
数回モジュロ演算の一つ2 1、及び素因数sqrt_n範囲のために要因か否かか否かを判定し、アレイFAC構造体ファクタで結果を提示します
3.最後に、残りのnが1でないなら(モジュロのでnは常に、私たちはsqrt_n範囲内で解決することができ、nは1になります場合は、最終的には、任意の操作を必要としない)、n個の構造体要素の配列を置くしようとしていますFAC、1の順序
4.最後のステップは、今のprintfで、ライン上の印刷の形式要件に準拠しているCIN以前よりもどのように気持ちをscanf関数、COUTも快適な、それは母であるのか分かりません
ピット:1つの素数表2は初めからあるので、印刷、プライムサイクルはI = 2から開始する必要があります、または無限ループに陥るかを決定します
前記第三の部分は、nが1であると判断し、nは0ではありません
書式#include <iostreamの> 書式#include <stdio.hに> する#include <cmath> 使用して 名前空間はstd; int型の isprime [ 100005 ]。 // 0是1不是 空隙 find_prime(int型N){ ため(int型 I = 2 ; iが<= N; I ++){ // 从2开始 場合(isprime [I] == 0 ){ ため(INT J J <= N; J = + = iがI + I){ isprime [J] = 1 。 } } } } 構造体係数{ int型のF。 int型のp; } FAC [ 20 ]。 INT メイン(){ freopenは(" in.txt "、" R " 、STDIN)。 int型の入力を、 scanf関数(" %のD "、および入力)。 もし(入力== 1){ // 特殊情况为1つ のprintf(" 1 = 1 " )。 リターン 0 ; } INT N = 入力。 INT sqrt_n = SQRT(N)。 find_prime(sqrt_n)。 int型のポジ= 0 ; 以下のために(int型 I = 2 ; I <= sqrt_n; ++ I){ // 一定要从2开始 場合(isprime [I] == 0 ){ int型のカウント= 0 ; 一方、(N!= 0 && N%iは== 0 ){ カウント ++ 。 N / = I。 } 場合(カウント!= 0 ){ FAC [ポジ] .F = I。 FAC [POSI] .P =カウント; POSI ++ ; } であれば(N == 0 ) ブレーク。 } } もし(!N = 1){ // 不等于1つの FAC [ポジ] .F = N。 FAC [POSI] .P = 1 。 } のprintf(" %d個= " 入力)。 以下のために(int型 I = 0 ;; ++ I){ 場合(FAC [i]が.P == 0 ) 破ります。 もし(!I = 0 ) のprintf(" * " ); printf(" %dの" 、FAC [i]は.F)。 もし(!FAC [i]を.P = 1 ) のprintf(" ^%d個" 、FAC [i]を.P)。 } 戻り 0 。 }