算法实现技巧(一):数的处理总结

数的处理

  • 对数位的操作

(1) 求整数各位之和

int GetGigitSum(int number)
{
     int sum=0;
     while(number)
     {
      sum=number%10;
      number/=10;
     }
     return sum;
}

(2) 进制之间转换

  1. 将某n进制数转化为十进制数

void func1(int  x, int n)   
{
	int y = 0;   //y为要转化的十进制数
	int product = 1;   // 幂次
	while (x != 0)
	{
		y = y + (x % 10)*product;
		x /= 10;
		product *= n;
	}
}
  1. 将十进制数转化为某m进制数
void func2(int y, int m)
{
	int z[40], num = 0;  // z存放转换为m进制的数
	do {
		z[num++] = y % m;
		y /= m;
	} while (y != 0);
}

附: 一个实现任意进制转化的函数,并且测试代码

#include<iostream>
#include<string>
#include<cstring>

using namespace std;
//任意进制之间的转换

/**
* s1  转换之前的数
* s2  转换之后的数
* d1  原进制数
* d2  需要转到的进制数
*     高于9的位数用大写'A'~'Z'表示,2~16位进制通过验证
*/
void conversion(string s1, string &s2, long int d1, long int d2) {

	//思路,还是将原数转换成十进制数 -> 再由十进制数转换成目标进制的数
	long int i, j, t, num;
	char c;
	num = 0;
	//先转换成十进制数
	for (i = 0; i < s1.size(); i++) {
		if (s1[i] >= '0'&&s1[i] <= '9') {
			t = s1[i] - '0';
		}
		else t = s1[i] - 'A' + 10;
		//参考十进制的方式
		num = num * d1 + t;
	}
	i = 0;
	s2 = "";
	while (1) {

		t = num % d2;
		num /= d2;
		if (t <= 9)s2 = to_string(t) + s2;
		else s2 = (char)((t - 10 + 'A')) + s2;
		if (num == 0) break;
	}

}

//测试函数
int main() {

	string str1, str2;
	long int d1, d2;
	while (cin >> str1 >> d1 >> d2) {
        conversion(str1, str2, d1, d2);
		cout << str2 << endl;
	}

	return 0;
}

  • 判断数字的奇偶性

(1)
bool func1(int n)
{
if(n%2==1) return false;
else return true;
}

(2)
bool func2(int n)
{
if(n & 0x1 ==1) return false;
else return true;
}

  • 浮点数比较大小
bool equal(double a, double b) {   // or float
        if ((a- b> -0.000001) && (a- b) < 0.000001)
            return true;
        else
            return false;
    }

浮点数比较大小应该在一定的区间内;equal函数由自己编写

  • 分数

(1)分数的表示

struct fraction{
int up,down; // up 分子 down 分母
};

(2)分数的化简,约分

主要处理以下几种情况:

  1. 如果分母是负数

  2. 如果分子为0

  3. 约分,找出,分子分母的最大公约数,同时相除;
    .



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

struct fraction{
	int up,down;   // up 分子  down 分母 
};


fraction reduction(fraction result) 
{
	if(result.down<0)
	{
		result.down=-result.down;
		result.up=-result.up;
	}
	if(result.up==0)
	{
		result.down=1;
	}
	else{
		int d=gcd(abs(result.down),abs(result.up));
		result.down/=d;
		result.up/=d;
	}
	return result;
} 

(3)分数的加减乘除

遵从相应的法则即可,最后输出 return func(fraction) // func为化简函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值