3.5 进制转换
- P进制转换为10进制
// y 为要求的 10进制数 // x 为 P 进制数,循环中每次取一位 // product 在循环中不断乘 P,得到 P 的幂次 int y = 0, product = 1; while (x != 0){ y = y + (x % 10) * product; x = x / 10; product = product * P; }
- 10进制转换为Q进制
// 数组 z 用来存放所求 Q进制数的每一位 // num 为 Q进制数的位数 int z[40], num = 0; do { z[num++] = y % Q; // 除基取余法 y = y / Q; } while (y > 0); // z 数组从 z[num-1] 到 z[0] 即为所求
第五章 数学问题
5.2 最大公约数与最小公倍数
1 int gcd(int a, int b) //求最大公约数的辗转相除法递归写法——【最小公倍数可用穷举法】 2 { 3 if(b == 0) return a; 4 else return gcd(a, a % b); 5 } 6 7 int main() 8 { 9 int m, n; 10 while( scanf("%d%d", &m, &n ) != EOF){ 11 printf("%d ", gcd(m, n)); 12 } 13 return 0; 14 }
5.3 分数的四则运算
struct Fraction{ //分数 int up, down; //分子、分母 };
5.4 素数
- 素数判断
bool isPrime(int x) //1既不是素数也不是合数 { if(x < 2) return false; for(int i = 2; i*i <= x; i++) if(x % 2 == 0) return false; return true; }
- 素数筛法【复杂度:O(nloglogn)】
const int maxn = 101; //表长 int prime[maxn], num = 0; //prime数组存放所有素数 num为素数个数 bool p[maxn] = {0}; //如果 i为素数 p[i]为false 否则为true void find_Prime() { for(int i = 2; i < maxn; i++) //从2开始 i<maxn结束 注意不能写成i<=maxn { if(p[i] == false) { prime[num++] = i; for(int j = i+i; j < maxn; j++) p[j] = true; } } }
5.5 质因子分解
struct factor{ int x, cnt; //x为质因子 cnt为其个数 }f[10]; if(n % prime[i] == 0) //如果prime[i]是n的因子 { f[num].x = prime[i]; //记录该因子 f[num].cnt = 0; while(n % prime[i] == 0) // 计算出质因子prime[i]的个数 { f[num].cnt++; n /= prime[i]; } num++; //不同质因子个数加 1 } if(n != 1) //如果无法被根号n以内的质数除尽 { f[num].x = n; //那么一定有一个大于根号n的质因子 f[num++].cnt = 1; }
5.6 大整数运算
struct bignum{ int num[1000]; int len; bignum()//构造函数 { memset(num, 0, sizeof(num));//初始化结构体 len = 0; } };
字符串输入转数字分别存入数组,模拟高精度加减运算。
*5.7 扩展欧几里得算法
*5.8 组合数
//计算n!中有多少个质因子p int cal(int n, int p) { int ans = 0; while(n) { ans += n / p; //累加n/p^k n /= p; } return ans; }
时间复杂度:O(logn)
第六章 C++标准模板库(STL)
【所有代码必须手动模拟一遍,无论是函数功能模块还是完整程序】