1.进制转换
void conversion(char s1[],char s2[],long d1, long d2)
{
long i,j,t,num;
char c;
num = 0;
for(i = 0; s1[i] != '\0'; i++)
{
if(s1[i] <= '9' && s1[i] >= '0')
t = s1[i] - '0';
else
t = s1[i] - 'A' + 10;
num = num * d1 + t;
}
i = 0;
while(1)
{
t = num % d2;
if(t <= 9)
s2[i] = t + '0';
else
s2[i] = t + 'A' - 10;
num /= d2;
if(num == 0)
break;
i++;
}
for (j = 0; i < i / 2; j++)//反向输出
{
c = s2[j];
s2[j] = s[i - j];
s2[i - j] = c;
}
s2[i + 1] = '\0';
}
2.最大公约数和最小公倍数
//辗转相除法
int a,b,c,m,t;
if(a<b) { t=a; a=b; b=t; }
m=a*b;
c=a%b;
while(c!=0) { a=b; b=c; c=a%b; }
printf("最大公约数是:\n%d\n",b);
printf("最小公倍数是:\n%d\n",m/b);
3.快排
//排序上届通常为0, 排序下届通常为数组元素个数, int b[]被排序元素
void quicksort(int l, int r, int b[])
{
int i, j, x;
if (l >= r)
return;
i = l; j = r; x = b[i];
while (i != j)
{
while (b[j] > x && j > i)
j--;
if (i < j)
{
b[i] = b[j];
i++;
}
while (b[i] < x && j > i)
i++;
if (i < j)
{
b[j] = b[i];
j--;
}
}
b[i] = x;
quicksort (l, j-1, b);
quicksort (i+1, r, b);
}
4.判断素数
int comp (int n)
{
int i, flag = 1;
for (i = 2; i <= sqrt(n); i++)
if (n % i == 0) { flag = 0; break; }
if (flag == 1)
return 1;
else return 0;
}
5.二分查找
int search_bin (int *t, int k)
{
int low = 1, high = 10, mid;
While (low <= high)
{
mid = (low + high) / 2;
if (k == t[mid]) return mid;
else if (k < t[mid]) high = mid - 1;
else low = mid + 1;
}
return -1;
}
6.快速幂
a * b% m = (a % m) * (b % m) % m
ab相乘后再取模等于ab分别先取模后相乘再取模。
private static int quickcount(int a, int b)
{
int s = 1;
while (b > 0)
{
if (b % 2 == 1)
{
s = s % 1000;
a = a % 1000;
s = s * a;
}
a = a % 1000;
a = a * a;
b = b >> 1;
}
return s % 1000;
}
7.旋转矩阵
void turn_90()
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a90[i][j]=a[n-1-j][i];
}
void turn_180()
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a180[i][j]=a[n-1-i][n-j-1];
}
void turn_270()
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a270[i][j]=a[j][n-1-i];
}
#define MS(x, y) memset(x, y, sizeof(x))
//把数组给初始化成0或者-1
#define ls o<<1
//左移1位,左移是*2
#define rs o<<1|1
//右移,并且变成奇数,右移是/2
const int N = 55, M = N * N, Z = 1e9 + 7,inf = 0x3f3f3f3f;
N是做题常用到的数组下标最大值,M是N*N可以用来开二维数组
Z用来取模,因为有些数字特别大,要输出的话就要对一个很大的质数求余数
inf是int最大值,相当于无穷大的意思,一般用来当min的初始值。
a =0010(0x02) a >>= 1; (a 右移1位并把右移的结果重新赋值给a) 此时a= 0001(0x01);
a <<= 1;(a左移1位并把左移的结果重新赋值给a) 此时 a = 0100(0x04);
a &= 0x01;( a与0x01 按位与,并把按位与的结果重新赋值给a)。此时a = 0x0;
a |= 0x01;( a与0x01 按位或,并把按位或的结果重新赋值给a)。此时a = 0011(0x03);
a ^= 0x01;( a与0x01 按位异或,并把按位异或的结果重新赋值给a)。此时a = 0x03;
(异或的意思就是,该位均为相同的则该位结果为0,该位均为不同的则该位结果为1)
<<:移运算符,num << 1,相当于num乘以2
>>:右移运算符,num >> 1,相当于num除以2
>>>:无符号右移,忽略符号位,空位都以0补齐