leetcode刷算法 | 数学问题 | 素数 | 最大公约数 | 最小公倍数

刷于2021年12月9日
欢迎查看我的成长笔记

数学问题

  • 进制转换
    • NC112进制转换
      • 题目
      • 代码
    • 504七进制转换
      • 题目
      • 代码
    • NC120二进制中1的个数
      • 题目
      • 代码
  • 最大公约数和最小公倍数
    • 1979找出数组的最大公约数
      • 题目
      • 代码
      • 思路
  • 求素数
    • 判断单个数是不是
    • 求区间所有素数
  • 二分查找
    • 704二分查找
      • 题目
      • 代码

进制转换

NC112进制转换

题目

牛客网,题目链接,简单
leetcode刷算法 | 数学问题 | 素数 | 最大公约数 | 最小公倍数_第1张图片

代码

class Solution {
public:
    string solve(int M, int N) {
        // write code here
        string ans;
        int flag = 0;
         
        if(M<0){
           M = -M;
           flag = -1;
        }
         
        while(M){
            if(M%N>=10){
                ans += M%N+'A'-10;
            }
            if(M%N<10){
                ans += M%N+'0';
            }
             
            M /= N;
        }
                
        reverse(ans.begin(), ans.end());
         
        if(flag == -1){
            ans.insert(ans.begin(), '-');
        }
         
         
        return ans;
    }
};

504七进制转换

题目

leetcode,题目链接,简单
leetcode刷算法 | 数学问题 | 素数 | 最大公约数 | 最小公倍数_第2张图片

代码

class Solution {
public:
    string convertToBase7(int num) {
        if (num==0) {
            return "0";
        }

        string ans;
        int flag = 0;
        if(num<0){
            num = -num;
            flag = 1;
        }

        while(num){
            ans += num%7+'0';
            num /= 7;
        }
        if(flag){
            ans +='-';
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

NC120二进制中1的个数

题目

牛客网,题目链接,简单
leetcode刷算法 | 数学问题 | 素数 | 最大公约数 | 最小公倍数_第3张图片

代码

class Solution {
public:
     int  NumberOf1(int n) {
         string ans;
         int num = 0;
         unsigned int un = (unsigned int)n;
         //用unsigned int或者加-处理都可以
                 
         while(un){
             if(un%2 == 1){
                 num ++;
             }
             un /= 2;
              
         }
         return num;
     }
};

最大公约数和最小公倍数

1979找出数组的最大公约数

题目

leetcode,题目链接,简单

代码

class Solution {
public: 

    int gcd(int a,int b){
        if(b == 0) return a;
        return gcd(b,a%b);
    }

    int findGCD(vector<int>& nums) {
        int len =nums.size();
        sort(nums.begin(),nums.end());

        int min = nums[0];
        int max = nums[len-1];

        int ans = gcd(min,max);

        return ans;

    }
};

思路

求解方法较固定,
最大公约数:使用辗转相除法:即每次除数和余数相除,直至余数为0
最小公倍数:ab/最大公约数 (假设最大公约数为m,a=mn1,b=mn2,二者相乘后除掉一个m后为mn1*n2一定是最小公倍数)

求素数

判断单个数是不是

判断单个数是不是的时候,缩小for递归求公约数的范围:

int bound = (int)sqrt(x)+1;

bound为枚举上界,防止double带来的精度损失

求区间所有素数

用尽一切方法,缩小递归范围,减少时间复杂度

for(int i=2;i<=n;i++){//求2-n素数
	if(mark[i] == true) continue;//非素数,已标记
	prime[primeSize++] = i;//素数
	for(int j=i*i;j<=n;j+=i){//如果2是素数,那么2*2,2*2+2,2*2+2+2一定是非素数,提前标记上
	//j=i*i初始值因为i*k(若k
		mark[j] = true;
	}
}

二分查找

704二分查找

题目

leetcode,题目链接,简单
leetcode刷算法 | 数学问题 | 素数 | 最大公约数 | 最小公倍数_第4张图片

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int len = nums.size();
        int left = 0;
        int right = len-1;
        
        
        while(left<=right){
            int mid = (left+right)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid] > target){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }
        return -1;
    }
};

二分查找注意必须是有序数组

你可能感兴趣的:(算法刷刷,C++,leetcode,算法,职场和发展)