您的位置:首页 > 编程语言 > C语言/C++

心动C++ 情牵基础算法 II

2013-11-29 23:01 351 查看
/*---------------------------------------------------------------------------
 * Project: NB.cpp
 * Name: zwp
 * Date: 2013.11
 *---------------------------------------------------------------------*/

#include <iostream>

#define SIZE 10

int number1[SIZE] = { 0 };
int number2[SIZE] = { 0 };
int number[SIZE] =  { 0 };

/*
** N 的B进制表示
*/
void base(int* num, int n, int b)
{
	int q = n;
	int k = 0;

	while(q != 0)
	{
		num[k] = q % b;		// 余数
		q = q / b;			// 商
		k = k + 1;
	}
}

/*
** 整数相加
*/
void add(int* s, int* a, int* b)
{
	int c = 0;
	int d = 0;

	for(int indeu = 0; indeu < SIZE-1; ++ indeu)
	{
		d = (a[indeu] + b[indeu] + c)/2;
		s[indeu] = a[indeu] + b[indeu] + c - 2*d;
		c = d;
	}
	s[SIZE-1] = c;

}

int mul(int* s, int a, int* b)
{
	int p = 0;

	for(int indeu = 0; indeu < SIZE-1; ++ indeu)
	{
		if(b[indeu])
			s[indeu] = (a <<indeu);
		else
			s[indeu] = 0;
	}

	for(int index = 0; index < SIZE - 1; ++ index)
		p += s[index];
	
	return p;
}

/*
** 计算商和余数
*/
typedef struct
{
	int q;
	int r;
}N;

N* division(int a, int d)
{
	N n;
	n.q = 0;
	n.r = fabs((double)a);	// 取绝对值

	while(n.r >= d)		// 直到余数小于商
	{
		n.r -= d;
		n.q += 1;
	}
	if(a < 0 && n.r > 0)
	{
		n.r = d - n.r;
		n.q = -(n.q + 1);
	}

	return &n;
}

void display(int* number, int size)
{
	for(int index = size-1; index >= 0; -- index)
		std::cout <<number[index]<<"  ";

	std::cout << std::endl;
}

/*
** 同余冥
*/
int modular(int b, int* a, int m)
{
	int x = 1;
	int power = b % m;

	for(int index = 0; index < SIZE-1; ++ index)
	{
		if(a[index])
			x = (x * power) % m;
		
		power = (power*power) % m;
	}

	return x;		// b^a % m
}

/*
** 欧几里得算法
*/
int gcd(int a, int b)
{
	int x = a;
	int y = b;
	int r = 0;

	while(y)
	{
		r = x % y;		// 余数
		x = y;
		y = r;
	}

	return x;
}

/*
** Chinese mode
*/

typedef struct 
{
	int s;		// 除数
	int m;		// 余数
	int M;
}S;

int chinesemode(S* s, int size)
{
	int m = 1 ;
	int x = 0 ;

	for(int index = 0; index < size; ++ index)
		m *= s[index].s;

	for(int index = 0; index < size; ++ index)
		s[index].M = m / s[index].s;

	for(int index = 0; index < size; ++ index)
		x += s[index].m * s[index].M * (s[index].M % s[index].s);

	return x%m;
}

void main(int argc, char* argv[])
{

	base(number1, 16, 2);
	display(number1, SIZE);

	base(number2, 10, 2);
	display(number2, SIZE);

	std::cout <<mul(number, 16, number2)<<std::endl;
	std::cout <<division(13, 2)->q<<"	"<<division(13, 2)->r<<std::endl;
	base(number, 3, 2);
	std::cout <<modular(3, number, 3)<<std::endl;		//3^number%2
	std::cout <<gcd(14, 7)<<std::endl;

	S s[3] = 
	{
		{3, 2, 0},
		{5, 3, 0},
		{7, 2, 0}
	};
	std::cout <<chinesemode(s, 3)<<std::endl;

	//add(number, number1, number2);					// number = number1 + number2
	//display(number, SIZE);

	system("pause");
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: