#include<iostream> #include<sstream> #include<string> usingnamespace std; //数值转化为string string convertToString(double x){ ostringstream o; if (o << x) return o.str(); return"conversion error";//if error } //string转化为数值 doubleconvertFromString(const string& s){ istringstream i(s); double x; if (i >> x) return x; return0.0;//if error } intmain(){ string s = convertToString(1947.9); int p = convertFromString("2048") + 4; cout << s << "*\n" << p << endl; }
使用map实现数字分离
对数字的各位进行分离使用取余等数学方法较慢,可以把数字看做字符串使用map映照
1 2 3 4 5 6 7 8 9 10 11
//该程序计算一个数字各个位的和 map<char, int>m; //构建字符映射数字 for (int i = 0; i < 10; i++) m[i + '0'] = i; string a = "123764"; int sum = 0; for (int j = 0; j < a.size(); j++) { sum += m[a[j]]; } cout << sum << endl;
同样也可以用数字映射字符,实现数字转字符
1 2 3 4
map<int, char>m; //构建字符映射数字 for (int i = 0; i < 10; i++) m[i] = i + '0';
如果n是偶数(不为0),先计算a的n/2次方,后平方;如果n是奇数,先计算a的n-1次方,再乘a;递归出口是a的0次方为1。递推公式如下: $a^{n}=a^{n-1} \cdot a$ , if n is odd $a^{n}=a^{\frac{n}{2}\cdot \frac{n}{2} } $ ,if n is even but not 0 $a^{n}=1$,if n=0
1 2 3 4 5 6 7 8 9 10 11 12
intqpow(int a, int n) { if (n == 0) return1; elseif (n % 2 == 1) returnqpow(a, n - 1) * a; else { int tmp = qpow(a, n / 2); return tmp * tmp; } }
非递归快速幂
1 2 3 4 5 6 7 8 9 10 11 12
doublePow(double x, int n) { double result = 1; while (n) { if (n & 1)// n为奇数 result *= x; n >>= 1; // n/2 x *= x; } return result; }
typedeflonglong ll; const ll mod = 1e9+7; ll qpow(ll a,ll b){ ll s = 0; while (b) { if (b & 1) //b为奇数 s = (s + a) % mod; a = (a + a) % mod;//b为偶数或者已经对奇数处理结束(后续b/2时会将奇数变为偶数),a扩大一倍 b >>= 1;//b除以2 } return s; }
图论
A*搜索算法
最短路径算法floyd算法
常用算法
gcd最大公约数
greatest common divisor,只要两数不相等,就反复用大数减小数, 直到相等为止,此相等的数就是两数的最大公约数
1 2 3 4 5 6 7 8 9
intgcd(int x, int y){ while (x != y) { if (x > y) x = x - y; else y = y - x; } return x; }