/*---------------------------------------------------------------------------
* 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");
}
心动C++ 情牵基础算法 II
最新推荐文章于 2014-06-29 20:36:49 发布