求整數的最大質因子


題目描述

對於給定的字符序列,從左至右將所有的數字字符取出拼接成一個無符號整數(字符序列長度小於100,拼接出的整數小於2^31,),計算並輸出該整數的最大素因子(如果是素數,則其最大因子為自身)

輸入描述:

有多組數據,輸入數據的第一行為一個正整數,表示字符序列的數目,每組數據為一行字符序列。

輸出描述:

對每個字符序列,取出所得整數的最大素因子,若字符序列中沒有數字或者找出的整數為0,則輸出0,每個整數占一行輸出。
示例1

輸入

復制
3
sdf0ejg3.f?9f
?4afd0s&2d79*(g
abcde

輸出

復制
13
857
0
分析:本題目有兩個要點,一是如何將字符串中的數字提取出來並計算成對應的整數
而是求出這個數的最大質因子
需要注意的是:1.質數的最大質因子就是其本身,一個合數總可以分解為幾個質因子之積,所以並無需驗證是否為質數
2.一個合數如果有超過根號n的質因子,有且僅有一個,
/*

對於本題而言,下邊使用了快速分解定理:
1、即對於一個合數總存在有質數因子,所以我們在分解合數的時候不需要判斷被整除的因子是否為質數。
2、理解是一個難點,對於一個合數,我們將小於等於這個合數平方根的質因子整除完之后,若
余下的書大於1,說明本合數存在並且僅存在一個大於這個合數的平方根的質因子*/
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
using namespace std;
const int maxn = 100000;
int max_yinzi(int n)
{
    int max =0;
    for(int i=2;i<=sqrt(1.0*n);i++)//從2到根號n求其質因數
    {
        while(n%i==0)              //因為一個質因數可能會乘多次,所以應該用while,而不是if
        {
            max = i;               //讓max指向當前最大值
            n /= i;                //除以質因數
        }
        if(n==1)
            break;
    }
    if(n!=1)                       //如果n不等於1,說明存在一個大於根號n的質因數,有且僅有一個,即等於當前的n
        max = n;
    return max;
}
int main()
{
    int n;
    vector<string> str;
    char ch[101];
    string temp;
    int sum;
    double count;
    while(cin>>n)
    {
        str.clear();//清空
        getchar();  //用在gets()之前
        for(int i=0;i<n;i++)
        {    
            gets(ch);   //考慮到輸入可能有空格
            str.push_back(ch);
        }
        for(int i=0;i<n;i++)//對str中每一個字符串進行分析
        {
            sum = 0;
            count = 0;
            temp = str[i];
            for(int j = temp.length()-1;j>=0;j--)  //從后往前,
            {
                if(temp[j]>='0'&&temp[j]<='9')
                {
                    sum += (temp[j] -'0')*pow(10.0,count);
                    count++;
                }
            }
            cout<<max_yinzi(sum)<<endl;
        }
    }
    return 0;
}

運行時間:54ms

占用內存:492k

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM