zoukankan      html  css  js  c++  java
  • NYOJ-520 最大素因子

    这个题基本上就两个知识点, 一个素数筛选法求素数,另一个是求最大公因子, 不过确定最大素数在素数表中的位置时,要用到二分的思想,不然会超时,下面是具体代码的实现;

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define SIZE 1000020
     4 int prime[SIZE];//来保存素数,从下标1开始保存第一个
     5 int temp[SIZE];//这个是用素数筛选法求出的素数
     6 int maxPrimeFactor(int n)//求最大素因子的函数
     7 {
     8     int ans;
     9     for(int i = 2; i * i <= n; i ++)
    10     {
    11         while(n % i == 0)
    12         {
    13             ans = i;//如果能求余, 那么当前的i 就是一个素因子
    14             n /= i;//将n缩小
    15         }
    16     }
    17     if(n > 1)//此时说明n 没有被任何一个素数整除, 最大素因子的当然是他本身
    18         ans = n;
    19     return ans;
    20 }
    21 int main()
    22 {
    23 //    freopen("1.txt", "r", stdin);//利用重定向
    24 //    freopen("2.txt", "w", stdout);
    25     int N;
    26     temp[1] = 1;
    27     for(int i = 0; i < SIZE; i ++)//将整个素数表初始化
    28         temp[i] = i;
    29     for(int i = 2; i * i< SIZE; i ++)
    30     {
    31         if(temp[i] != -1)
    32         {
    33             for(int j = i * i; j < SIZE; j += i)
    34                 temp[j] = -1;//如果不是素数就将它标记为-1
    35         }
    36     }
    37     int index = 1;
    38     for(int i = 2; i < SIZE; i ++)
    39     {
    40         if(temp[i] != -1)
    41             prime[index ++] = temp[i];//将素数表中的素数复制到prime数组中
    42     }
    43     while(scanf("%d", &N) != EOF)
    44     {
    45         if(N == 1)//特殊数字,特别对待
    46         {
    47             printf("0
    ");
    48             continue;
    49         }
    50         int left = 1, right = index - 1, mid = (left + right) / 2;//利用二分法确定最大素数在素数表prime中位置,如果直接for循环会超时
    51         int maxPrime = maxPrimeFactor(N);
    52         if(maxPrime == prime[right])//此时下标不是从零开始, 所以只有两个元素时,假如要确定后一个的位置,当前这个二分不行,这个特殊情况单独写出来
    53         {
    54             printf("%d
    ", right);
    55             continue;
    56         }
    57         while(maxPrime != prime[mid])
    58         {
    59             if(maxPrime > prime[mid])
    60                 left = mid;
    61             else
    62                 right = mid;
    63             mid = (left + right) / 2;
    64         }
    65         printf("%d
    ", mid);//打印下标
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    C# 请求API(一次登陆,多次请求)
    C# WebAPI 跨域问题Cors
    正则表达式校验YYYYMMDD
    C# 通过Smtp 完成系统发送邮件
    C# Log4Net 记录项目日志
    C# 自定义Attribute
    C#泛型
    SQL从数据库导出数据到EXCEL换行的问题解决方法
    C# 在MVC 中把DataTable中的数据导出到Excel
    闹心的CSDN
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/3991374.html
Copyright © 2011-2022 走看看