超完整素数算法总结归纳

简介: 超完整素数算法总结归纳

目录


素数的判定


Eratosthenes筛选(素数筛选)


因子数与因子和


完美数


n的第k个因子


分拆质数和


分解质因数


最接近的因数


丑数


素数的判定


Eratosthenes筛选(素数筛选)


因子数与因子和


完美数


n的第k个因子


分拆质数和


分解质因数


四因数


最接近的因数


丑数


image.png


image.png

#include<stdio.h>
int main()
{
int n=10;
int flag=1;
for(i=2;i<n;i++)
{
if(n%i==0)
{
flag=0;
break;
}
}
if(flag=1)
{
printf("是");
}
else
printf("否");
}

image.png

#include<stdio.h>
int main()
{
int n=10;
int flag=1;
for(i=2;i<=n/i;i++)
{
if(n%i==0)
{
flag=0;
break;
}
}
if(flag=1)
{
printf("是");
}
else
printf("否");
}

image.png

image.png

#include<stdio.h>
int main()
{
int n=15;
int cnt=0,sum=0;//sum是用来记录所有的因子和,cnt是用来记录有多少个不同的因子
for(i=1;i<=n/i;i++)
{
if(n%i==0)
{
cnt++;
sum+=i;
if(i*i!=n)//避免同一个因子重复记录
{
cnt++;
sum+=n/i;
}
}
sum-=n;//这里是因为要把他本身给删掉了,本身不是他的因数
}
}

image.png

bool checkPerfectNumber(int num){
int i=1;
int sum=0;
for(i=1;i*i<=num;i++)//如果是i的话会超出去,控制在一半的范围
{
    if(num%i==0)
    {
        sum+=i;//找sqrt内
        if(num%(num/i)==0&&num/i!=i)
        {
            sum+=num/i;
        }
    }
}
sum-=num;
if(sum==num)
return true;
else
return false;
}

n的第k个因子

image.pngimage.png

int compare(const void*e1,const void *e2)
{
    return (*(int*)e1-*(int *)e2);
}
int kthFactor(int n, int k){
int count=0;
int i,j=0;
int arr[1000];
if(n==1&&k==1)
return 1;
for(i=1;i*i<=n;i++)
{
    if(n%i==0)
    {
        arr[j++]=i;
        if(i*i!=n)//去重复因子
        {
            arr[j++]=n/i;
        }
    }
}
//把所有因子都找出来了
//进行排序
qsort(arr,j,sizeof(int),compare);
if(j<k)//如果实际的因子数小于需要搜索的数,就返回一个-1
return -1;
else
{
    return arr[k-1];
}
}

分拆质数和

image.png

#define n 10005
int main()
{
  int isprime[10005];
  memset(isprime, 0, sizeof(isprime));
  int i;
  isprime[0] = isprime[1] = 1;
  int cnt = 0;
  int prime[10005];
  int j;
  for (i = 2; i <= 10005 ; i++)
  {
    if (isprime[i] == 0)
    {
      prime[cnt++] = i;
      for (j = i*i; j < 10005; j+=i)
      {
        isprime[j] = 1;
      }
    }
  }
  int x;
  while (scanf("%d", &x) && x)//当x为0就停止循环
  {
    int s = 0;
  //先枚举素数p,因为两个素数相加可以得到x,所以枚举p在x的一半即可,两者相加只可能在中间值的两边
    for (i = 0; i < cnt&&prime[i] <=(x / 2); i++)
    {
      int k = x - prime[i];
      if (isprime[k] == 0)
      {
        s++;
      }
    }
    printf("%d\n", s);
  }
  return 0;
}

分解质因数

image.png

int main()
{
  int i;
int arr[10000];
  for (i = 2; i <= (n / i); i++)
  {
    while (n%i == 0)//把其中一个质数除干净
    {
      arr[j++] = i;//把那个质数因子存起来
            n/=i;
    }
  }
  if (n > 1)
  {
    arr[j++] = n;
  }
}

image.png

int sum(int x)//计算因子和的函数
{
    int sum=0;
    int i=0;
    for(i=1;i<=(x/i);i++)
    {
        if(x%i==0)
        {
            sum+=i;
            if(i*i!=x)
            {
                sum+=(x/i);
            }
        }
    }
    return sum;
}
bool fourfactor(int n)//判断是否有4个因子的函数
{
    int i;
    int cnt=0;
    for(i=1;i<=(n/i);i++)
    {
        if(n%i==0)
        {
            cnt++;
            if(i*i!=n)
            {
                cnt++;
            }
        }
    }
    if(cnt==4)
    return true;
    else
    return false;
}
int sumFourDivisors(int* nums, int numsSize){
//先对每一个进行拆分是否有4个因数,
//拆分完后如果有4个因子
int i=0;
int addsum=0;
for(i=0;i<numsSize;i++)
{
    if(fourfactor(nums[i]))
    {
        addsum+=sum(nums[i]);//addsum就把因子和加起来
    }
}
if(addsum)
{
    return addsum;
}
return 0;
}

image.png

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* closestDivisors(int num, int* returnSize)
{
  //分别对n+1,和n+2进行因数分解,两者间的差值最小,比较的是差值的绝对值
  int i;
  int *ret = (int *)malloc(sizeof(int) * 2);
  *returnSize = 2;
  int min =-1;
  int j;
  int x, y;
  int flag = 1;
  for (i = num + 1; i <= num + 2; i++)
  {
    for (j = 1; j <= i / j; j++)
    {
      if (i%j == 0)//j是其中的一个因数,这个时候i/j也是其中一个因数
      {
        if (min >= abs(j - i / j) || min == -1)//我们初始化m为一个负数,避免对后续产生印象,假如第一次成立的化也能够进入if语句内部
        {
                    min = abs(j - i / j);
          x = j;
          y = i / j;
          if (min == 0)
          {
            flag = 0;;
          }
        }
      }
    }
    if (flag == 0)
    {
      break;
    }
  }
  ret[0] = x;
  ret[1] = y;
  return ret;
}

image.png

bool isUgly(int n)
{
    if(n==1)
    {
        return true;
    }
    if(n<=0)
    {
        return false;
    }
//分解质因数
int i;
int j=0;
int str[2000];
for(i=2;i<=n/i;i++)
{
while(n%i==0)
{
    str[j++]=i;
    n/=i;
}
}
if(n>1)//此时的n一定是个质数,如果被整除的话,就会n=1,所以整个条件控制的是n>1d
str[j++]=n;
int k=0;
int m=0;
for(k=0;k<j;k++)
{
  if(str[k]==2||str[k]==3||str[k]==5)
  {
      m++;//如果他是这3者其中一个质因数,m自增
  }
}
if(m==j)//如果m和他的所有质因数相同的时,就是都是这3个质因数
return true;
else
return false;
}
相关文章
|
11月前
|
算法
初阶OI素数算法——埃拉托尼斯筛
时间复杂度比较优秀且易于理解的素数筛选法
63 0
|
1月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
17 0
|
3月前
|
算法 Serverless 数据安全/隐私保护
RSA算法中,为什么需要的是两个素数?
PrimiHub是密码学专家团队开发的开源隐私计算平台,关注数据安全、密码学等领域。RSA算法使用两个素数确保安全,因为它们的乘积易于计算,但分解困难,形成加密基础。算法涉及选择大素数、计算乘积、生成公私钥对。加密时,消息通过公钥变形;解密则需私钥,安全性依赖于大数分解问题的复杂性。
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
|
存储 算法 Python
信息学奥赛 试除法:高效筛选素数的算法
本文介绍了在Python代码中如何使用试除法高效筛选素数。
111 0
|
4月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
69 0
2022 数据结构与算法《王道》学习笔记 (十一)KMP算法 详细归纳总结 改进的模式匹配算法
2022 数据结构与算法《王道》学习笔记 (十一)KMP算法 详细归纳总结 改进的模式匹配算法
2022 数据结构与算法《王道》学习笔记 (十一)KMP算法 详细归纳总结 改进的模式匹配算法
|
存储 分布式计算 算法
转:如何利用素数算法加强企业文档管理软件的效能和安全性
利用素数算法来加强企业文档管理软件的效能和安全性,可是个有趣的法子。这可不只是在电影里才看得到的情节,素数算法可以在好几个方面给软件的性能和安全性添点料。下面就来看看有哪些酷炫的方式吧——
83 0
|
算法
转:素数算法,看看电脑是怎么找素数的
素数算法主要应用于计算科学,密码学和数论等领域。例如,在密码学中,素数算法用于生成密钥;在数论中,素数算法用于研究质数分布。素数算法的历史可以追溯到公元前300年左右的古希腊数学家,他们发现了素数的重要性。随着数学和计算机科学的发展,素数算法也在不断改进和提高。
175 2
|
人工智能 算法 C#
C语言经典算法实例2:数组求素数
C语言经典算法实例2:数组求素数
C语言经典算法实例2:数组求素数