• 数学问题


    最大公约数&最小公倍数

    最大公约数

    Code 01

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

    Code 02

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

    Code 03

    int gcd(int a, int b) {
    	while(b!=0) {
    		int temp = a;
    		a = b;
    		b = temp%b;
    	}
    	return a;
    }
    

    分数四则运算

    分数的表示

    三部分:整数部分、小数部分-分子、小数部分-分母

    分数的化简

    1. 如果分母为负,分子分母同时取反
    2. 如果分子为0,令分母为1
    3. 分子绝对值和分母绝对值最大公约数化简

    Code 01

    void reduction(int &numerator, int & denominator){
    	if(denominator<0){
    		numerator=-numerator;
    		denominator=-denominator;
    	}
    	if(numerator==0){
    		denominator=1;
    	}else{
    		int gcdv = gcd(abs(numerator),abs(denominator));
    		numerator/=gcdv;
    		denominator/=gcdv;
    	}
    }
    

    分数打印

    1. 最大公约数化简
    2. 分母为1,直接输出分子
    3. 分子>分母,假分数要转换为真分数

    Code 01

    void show(int numerator, int denominator){
    	reduction(numerator,denominator);
    	if(denominator==1)printf("%d",numerator);
    	else if(abs(numerator)>denominator){
    		printf("%d %d/%d", numerator/denominator, abs(numerator)%denominator, denominator);
    	}else{
    		printf("%d/%d", numerator, denominator);
    	}
    }
    

    素数

    判断素数

    Code 01

    bool isPrime(int n) {
    	if(n<=1)return false;
    	int sqr = (int)sqrt(1.0*n);
    	for(int i=2; i<=sqr; i++) {
    		if(n%i==0)return false;
    	}
    	return true;
    }
    

    Code 02

    bool isPrime(int n){
    	if(n<=1)return false;
    	for(long long i=2; i*i<=n; i++) { //当i接近int上界时,会溢出int范围 
    		if(n%i==0)return false;
    	}
    	return true;
    }
    

    素数表

    思想

    思想 01

    遍历所有数字,判断是否是素数,若是素数,加入素数表(时间复杂度O(n√n) n<=10^5量级内可以处理)

    思想02

    埃式筛法:从小到大枚举,对每一个素数筛去其所有倍数,剩下的就是素数(时间复杂度O(nloglogn))

    Code

    Code 01

    #include <iostream>
    #include <cmath>
    using namespace std;
    /*
    	时间复杂度O(n√n) n<=10^5量级没有问题 
    */
    bool isPrime(int n) {
    	if(n<=1)return false;
    	int sqr = (int)sqrt(1.0*n);
    	for(int i=2; i<=sqr; i++) {
    		if(n%i==0)return false;
    	}
    	return true;
    }
    const int maxn = 100;
    int pt[maxn+1];
    void prime_table() {
    	int index=0;
    	for(int i=2; i<=maxn; i++) {
    		if(isPrime(i)){
    			pt[index++]=i;
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	prime_table();
    	for(int i=0;i<=maxn;i++){
    		printf("%d ",pt[i]);
    	}
    	return 0;
    }
    

    Code 02

    #include <iostream>
    #include <cmath>
    using namespace std;
    const int maxn = 100;
    int primes[maxn+1]; //素数表 
    bool pb[maxn+1]; //标记数字是否被筛掉 
    void prime_table() {
    	int index=0;
    	for(int i=2; i<=maxn; i++) {
    		if(pb[i]==false){ 
    			primes[index++]=i;
    			for(int j=i+i;j<=maxn;j+=i){
    				pb[j]=true; //当前素数所有倍数标记为筛除 
    			} 
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	prime_table();
    	for(int i=0;i<=maxn;i++){
    		printf("%d ",primes[i]);
    	}
    	return 0;
    }
    

    大整数

    大整数存储

    struct bign {
    	int d[1000]; //结构体数组中的元素不会初始化为0
    	int len; // 结构体中的整数不会初始化为0 int len=0;
    	bign() {
    		memset(d,0,sizeof(d));
    		len=0;
    	}
    };
    

    大整数比较

    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    struct bign {
    	int d[1000]; //结构体数组中的元素不会初始化为0
    	int len; // 结构体中的整数不会初始化为0 int len=0;
    	bign() {
    		memset(d,0,sizeof(d));
    		len=0;
    	}
    };
    int cmp(bign a, bign b) {
    	if(a.len>b.len)return 1; //a大 
    	else if(a.len<b.len) return -1;
    	else{
    		for(int i=a.len-1;i>=0;i--){
    			if(a.d[i]>b.d[i])return 1;
    			else if(a.d[i]<b.d[i]) return -1;
    		}
    		return 0;
    	} 
    }
    int main(int argc, char * argv[]) {
    	string a = "12345679";
    	string b = "12345678";
    	bign ab,bb;
    	for(int i=0; i<a.length(); i++)
    		ab.d[ab.len++]=a[a.length()-1-i]-'0';
    	for(int i=0; i<b.length(); i++)
    		bb.d[bb.len++]=b[b.length()-1-i]-'0';
    	int cr = cmp(ab,bb);
    	cout<<cr<<endl;
    	return 0;
    }
    

    大整数加法

    Code

    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    struct bign {
    	int d[1000]; //结构体数组中的元素不会初始化为0
    	int len; // 结构体中的整数不会初始化为0 int len=0;
    	bign() {
    		memset(d,0,sizeof(d));
    		len=0;
    	}
    };
    bign add(bign a, bign b) {
    	bign c;
    	int carry=0;
    	for(int i=0; i<a.len||i<b.len; i++) {
    		int temp = a.d[i]+b.d[i]+carry;
    		c.d[c.len++]=temp%10;
    		carry = temp/10;
    	}
    	if(carry!=0){
    		c.d[c.len++]=carry;
    	}
    	return c;
    }
    int main(int argc, char * argv[]) {
    	string a = "12345678";
    	string b = "12345678";
    	bign ab,bb;
    	for(int i=0; i<a.length(); i++)
    		ab.d[ab.len++]=a[a.length()-1-i]-'0';
    	for(int i=0; i<b.length(); i++)
    		bb.d[bb.len++]=b[b.length()-1-i]-'0';
    	bign c = add(ab,bb);
    	for(int i=c.len-1;i>=0;i--){
    		cout<<c.d[i];
    	}
    	return 0;
    }
    

    大整数减法

    Code

    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    struct bign {
    	int d[1000]; //结构体数组中的元素不会初始化为0
    	int len; // 结构体中的整数不会初始化为0 int len=0;
    	bign() {
    		memset(d,0,sizeof(d));
    		len=0;
    	}
    };
    bign sub(bign a, bign b) {
    	bign c;
    	int carry=0;
    	for(int i=0; i<a.len||i<b.len; i++) {
    		if(a.d[i]<b.d[i]) {
    			a.d[i+1]--;
    			a.d[i]+=10;
    		}
    		c.d[c.len++]=a.d[i]-b.d[i];
    	}
    	while(c.len>1&&c.d[c.len-1]==0) {
    		c.len--;
    	}
    	return c;
    }
    int main(int argc, char * argv[]) {
    	string a = "12345678";
    	string b = "-12300078";
    	bign ab,bb;
    	for(int i=0; i<a.length(); i++)
    		ab.d[ab.len++]=a[a.length()-1-i]-'0';
    	for(int i=0; i<b.length(); i++) {
    		if(b[b.length()-1-i]=='-')continue;
    		bb.d[bb.len++]=b[b.length()-1-i]-'0';
    	}
    	bign c = sub(ab,bb);
    	for(int i=c.len-1; i>=0; i--) {
    		cout<<c.d[i];
    	}
    	return 0;
    }
    

    大整数乘法

    Code

    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    struct bign {
    	int d[1000]; //结构体数组中的元素不会初始化为0
    	int len; // 结构体中的整数不会初始化为0 int len=0;
    	bign() {
    		memset(d,0,sizeof(d));
    		len=0;
    	}
    };
    bign add(bign a, int b) {
    	bign c;
    	int carry=0;
    	for(int i=0; i<a.len; i++) {
    		int temp = a.d[i]*b+carry;
    		c.d[c.len++]=temp%10;
    		carry = temp/10;
    	}
    	while(carry!=0){
    		c.d[c.len++]=carry%10;
    		carry/=10;
    	}
    	return c;
    }
    int main(int argc, char * argv[]) {
    	string a = "12345678";
    	int b = 82;
    	bign ab;
    	for(int i=0; i<a.length(); i++)
    		ab.d[ab.len++]=a[a.length()-1-i]-'0';
    	bign c = add(ab,b);
    	for(int i=c.len-1;i>=0;i--){
    		cout<<c.d[i];
    	}
    	return 0;
    }
    

    大整数除法

    Code

    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    struct bign {
    	int d[1000]; //结构体数组中的元素不会初始化为0
    	int len; // 结构体中的整数不会初始化为0 int len=0;
    	bign() {
    		memset(d,0,sizeof(d));
    		len=0;
    	}
    };
    bign div(bign a, int b, int &r) {
    	bign c;
    	c.len = a.len; //被除数和商每位应该是一一对应的
    	for(int i=0; i<a.len; i++) {
    		r = r*10+a.d[i];//每次被除数
    		if(r<b) { //不够除,商0
    			c.d[c.len-1-i]=0;
    		} else { //够除
    			c.d[c.len-1-i]=r/b;
    			r%=b;
    		}
    	}
    	while(c.len>1&&c.d[c.len-1]==0) {
    		c.len--;
    	}
    	return c;
    }
    int main(int argc, char * argv[]) {
    	string a = "448";
    	int b = 22;
    	bign ab;
    	for(int i=0; i<a.length(); i++)
    		ab.d[ab.len++]=a[i]-'0';
    	int r=0;//每次余数
    	bign c = div(ab,b,r);
    	for(int i=c.len-1; i>=0; i--) {
    		cout<<c.d[i];
    	}
    	cout<<endl;
    	cout<<r<<endl;
    	return 0;
    }
    
  • 相关阅读:
    关于java异常处理的自我学习
    html学习
    java第七周动手动脑
    作业
    动手动脑
    我要建立自己的java代码仓库
    第三周作业
    day0319 模块
    day0318装饰器和内置函数
    day0315 迭代器
  • 原文地址:https://www.cnblogs.com/houzm/p/12263998.html
Copyright © 2020-2023  润新知