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.相减法 大减小直至相等
方法3.最直接的逐个判断法: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; }
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.借助两个整数的最大公约数和最小公倍数的关系:![]()
方法2.最大除最小,最大乘2,乘3,...直至能整除//gcd(a,b)*lcm(a,b) = a*b int lcm(int m,int n){ return m*n/gcd_Euclid(m,n); }
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; } } }