• 求整数的最大质因子


    题目描述

    对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于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

     
  • 相关阅读:
    删除使用RMAN命令备份的文件
    查看.Net Framework版本的方法(zz)
    c# Foreach last (zz)
    Visual Studio 2008 QFE (zz)
    打印机的接口
    牛人的PENTAX单反之路
    我新进的宾得K10D机器和镜头
    买车险要有足额第三者责任险
    谈谈P家的SUPERTAKUAMR
    硬盘接口总结
  • 原文地址:https://www.cnblogs.com/ttzz/p/10539126.html
Copyright © 2020-2023  润新知