1. 程式人生 > >演算法訓練 素因子去重

演算法訓練 素因子去重

開發十年,就只剩下這套架構體系了! >>>   

問題描述

        給定一個正整數n,求一個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1

輸入格式

        一個整數,表示n

輸出格式

        輸出一行,包含一個整數p。

樣例輸入

        1000

樣例輸出

10 

資料規模和約定

        n<=10^12
  樣例解釋:n=1000=2^3*5^3,p=2*5=10 

解題思路

        在忽略資料規模的情況下,我的想法是先求出n的所有素因子,然後將素因子相乘。在考慮資料規模的情況下,我們需要考慮1e12這個資料規模,我曾經想過使用陣列存放素因子,但是在這個大規模下,機器記憶體佔用太大,無法通過測試用例。百思不得其解的時候,我在網上看到了

一位大佬給出的該題解法,他的思路也是求出n的所有素因子,然後將素因子相乘,區別是每當求出素因子後,大佬的做法是先用n除去素因子,得到一個去除已知素因子倍數後的數,降低n,迴圈定址下一個素因子,直到結束。

        向大佬致敬。

        下面貼出我的第一版實現和最後一版實現,中間有好幾版,但不具有代表性,故不記錄。

程式碼實現-第一版

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int isPrime(int number);
int main(int argc, char *argv[]) {
	int number = 0, i;
	int sum = 1;
	scanf("%d", &number);
	for (i = 2; i < number; i++) {
		if ( number % i ==0 && isPrime(i)) {
			sum *= i;
		}
	}
	printf("%d\n", sum);
	return 0;
}

int isPrime(int number) {
	int i;
	for (i = 2; i <= sqrt(number); i++) {
		if (number % i == 0) {
			return 0;
		}
	}
	return 1;
}

程式碼實現-最終版

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
	long long number, sum = 1, i;
	scanf("%lld", &number);
	for (i = 2; i <= number; i++) {
		if ( number % i ==0) {
			sum *= i;
			while( number % i == 0 ) {
				number /= i;
			}
		}
	}
	printf("%lld\n", sum);
	return 0;
}

評測結果

相關推薦

演算法訓練 因子

開發十年,就只剩下這套架構體系了! >>>   

藍橋杯算法訓練 因子

ring n) \n pan while pre ble class 直接 原題鏈接: http://lx.lanqiao.cn/problem.page?gpid=T513題目意思是找到n的所有素因子,再把這些素因子相乘1000 = 2*2*2*5*5*5 p = 2

【藍橋杯】算法訓練 因子

6.0 == argc 兩個 時間 直接 .html html urn 算法訓練 素因子去重 時間限制:1.0s 內存限制:256.0MB 問題描述   給定一個正整數n,求一個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1 輸

藍橋杯 ALGO-39 演算法訓練 陣列排序

演算法訓練 陣列排序去重   時間限制:1.0s   記憶體限制:512.0MB        問題描述   輸入10個整陣列成的序列,要求對其進行升序排序,並去掉重複元素。 輸入格式   1

[Java] 藍橋杯ALGO-39 演算法訓練 陣列排序

問題描述輸入10個整陣列成的序列,要求對其進行升序排序,並去掉重複元素。輸入格式10個整數。輸出格式多行輸出,每行一個元素。樣例輸入2 2 3 3 1 1 5 5 5 5樣例輸出1235 packag

演算法--全排列,全排列以及非遞迴實現

問題1: 給定字串1234無重複字元,求其所有排列 遞迴方式求解: def swap(num, i, j): tmp = num[i] num[i] = num[j] num[j] = tmp #num無重複數字 def fullSort(num, index)

ALGO-39_藍橋杯_算法訓練_數組排序

define for stdio.h main 描述 AR 訓練 組成 思路 問題描述   輸入10個整數組成的序列,要求對其進行升序排序,並去掉重復元素。 輸入格式   10個整數。 輸出格式   多行輸出,每行一個元素。 樣例輸入 2 2 3 3 1 1 5 5 5

大量資料:Bitmap點陣圖演算法和布隆過濾器(Bloom Filter)

Bitmap演算法 與其說是演算法,不如說是一種緊湊的資料儲存結構。是用記憶體中連續的二進位制位(bit),用於對大量整型資料做去重和查詢。其實如果並非如此大量的資料,有很多排重方案可以使用,典型的就是雜湊表。 實際上,雜湊表為每一個可能出現的數字提供了一個一一對映的關係,每個元素都相當於有

資料結構演算法題/陣列

package com.lee.wait; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /**  * ArrayUniue 陣列去重的問題  */ public clas

演算法-hash-set

Well, as Bavarious pointed out in a comment, Apple's actual CoreFoundation source is open and available for your perusal too. NSSet is

javascript array js 快取演算法,陣列、陣列隨機抽取、字母串轉數字,數字轉字串

前言 因為平時在寫程式碼的過程中,有些演算法會經常重複寫,比如陣列去重、陣列抽取隨機值等!雖然這些不是很難的邏輯,但是每次剛開始遇到需求的時候,還是需要琢磨一些時間才能想出來,所以此文件把這些常見演算法的思想記錄下來,以便下次再遇到的時候不會手腳無措了! 這篇文件不考慮es6等

JavaScript陣列演算法例項

本文主要介紹了JavaScript陣列去重演算法,結合例項形式總結分析了JavaScript陣列去重相關的讀寫、遍歷、比較、排序等操作及演算法改進相關實現技巧,需要的朋友可以參考下 測試用例: arr = ["1",3,"1",1,4,5,1,"2",5,1,

W3Cschool高階指令碼演算法(5.排列組合演算法挑戰)

排列組合去重演算法挑戰 問題: 把一個字串中的字元重新排列生成新的字串,返回新生成的字串裡沒有連續重複字元的字串個數.連續重複只以單個字元為準 例如, aab 應該返回 2 因為它總共有6中排列 (aab, aab, aba, aba, baa, baa), 但是隻有兩

關於URL-MD5演算法步驟

URL去重-MD5演算法學習筆記 URL去重-MD5演算法學習筆記 在網路爬蟲過程中,會爬取到很多相同的url,這個時候就需要我們去掉重複的URL。關於URL去重的演算法有很多,剛剛學習了MD5演算法。MD5演算法是基於Hash的演算法。所以首先說說Hash演算法。 Hash演算

js中陣列常用邏輯演算法(從大到小,從小到大排序,等問題)

從小到大: // 從小到大順序排序 minSort (arr) { var min for (var i = 0; i < arr.length; i++) { for (var j = i; j < arr.le

演算法

1 先排序後去重 <script type="text/javascript"> arry=[0,3,2,4,2,6,8,3,2,1]; list= method4 (); function method4 (){ //將陣列進行排序

【應用演算法】資訊流-推薦系統的策略

聊兩個問題,它們看似和推薦系統沒有必然關係,但實際上, 在你構建自己的推薦系統的時候,不可避免地會遇到這兩個問題。 去重是剛需 在推薦系統中,有一個剛需就是去重,那麼說在哪些地方有去重的需求呢? 主要是在兩個地方:一個是內容源去重,另一個是不重複給使用者推薦。

文件演算法:SimHash和MinHash

來源:http://grunt1223.iteye.com/blog/964564 在工作學習中,我往往感嘆數學奇蹟般的解決一些貌似不可能完成的任務,並且十分希望將這種喜悅分享給大家,就好比說:“老婆,出來看上帝”……  隨著資訊爆炸時代的來臨,網際網路上充斥著著大量的

遞迴演算法

#coding:utf8 import random # 遞迴 def getNoRepeatNum(havenum): num = random.randint(1,10) if num in havenum: num = getNoRepeatNum(h

js實現常見的幾種演算法(陣列、字元統計、二分查詢等)

1、陣列去重:利用物件屬性進行篩選 function filter(arr){ let obj={}; let newArr=[]; for (let i=0;i<arr.