常见基本计算

本文详细介绍了十进制转二进制的两种方法,并深入探讨了最大公约数和最小公倍数的计算算法。通过具体代码实现,展示了不同方法的原理与应用,适合计算机科学领域的学习者和开发者深入了解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.十进制转二进制

方法1:取余赋值,除二判断
代码如下:(注:binary为char[]数组,大小大于32)
void Decimal2Binary_1(int n,char* binary){
	if(binary==NULL)return;
	
	int index=0;
	char* pBin = binary+31;
	while(n!=0){
		(*pBin--)=n%2;
		n = n/2;
	}
	
	return;	
}
方法2:从2的31次幂减1到2的0次幂进行大小比较
代码如下(注:binary为char[]数组,大小大于32)
void Decimal2Binary_2(int n,char* binary){
	if(binary==NULL)return;
	int index = 0;
	for(int i=31;i>=0;i--){
		int tmp;
		if(i==31){
			tmp = pow(2,i)-1;
		}else{
			tmp = pow(2,i);
		}
		if(n>=tmp){
			n-=tmp;
			binary[31-i]=1;
		}else{
			binary[31-i]=0;
		}
	}
	return;
}

2.公约数公倍数因式

1)最大公约数
方法1.欧几里得算法(,小)=(小,大余小)
//gcd(a,b) = gcd(b,a mod b)
int gcd_Euclid_Iterative(int m,int n){
    if(m==0||n==0)return -1;

    int max = m>n?m:n;
    int min = m<n?m:n;
    int remain = max%min;
    while(remain){
        max = min;
        min = remain;
        remain = max%min;
    }
    return min;

}
/*cannot exclude situation that one of parameters is zero*/
int gcd_Euclid_Recursive(int m,int n){
    /*int max = m>n?m:n;
    int min = m<n?m:n;
    if(max%min){
        gcd_Euclid_Recursive(min,max%min);
    }
    return min;*/
    return n?gcd_Euclid_Recursive(n,m%n):m;
}
方法2.相减法 大减小直至相等
int gcd_Subtraction(int m,int n){
    int max = m>n?m:n;
    int min = m<n?m:n;
    max = max - min;
    if(max!=min){
        return gcd_Subtraction(max,min);
    }
    return min;
}
方法3.最直接的逐个判断法:
int gcd(int m,int n){
	int min = m<n? m:n;
	for(int i=min;i>=1;i--){
		if(m%i==0 && n%i==0){
			return i;
		}
	}
2)最小公倍数
方法1.借助两个整数的最大公约数和最小公倍数关系:G.C.D.(a, b) \times L.C.M.(a, b) = |ab|
//gcd(a,b)*lcm(a,b) = a*b
int lcm(int m,int n){
	return m*n/gcd_Euclid(m,n);
}
方法2.最大除最小,最大乘2,乘3,...直至能整除
int lcm_enumeration(int m,int n){
    if(m==0||n==0)return -1;
	
    int max = m>n?m:n;
    int min = m<n?m:n;

    for(int i=1; ;i++){
        if((max*i)%min==0){
            return max*i;
        }
    }
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值