输入输出
sscanf 和sprintf
质数
我们继续分析,其实质数还有一个特点,就是它总是等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。
如何论证这个结论呢,其实不难。首先 6x 肯定不是质数,因为它能被 6 整除;其次 6x+2 肯定也不是质数,因为它还能被2整除;依次类推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那么,就只有 6x+1 和 6x+5 (即等同于6x-1) 可能是质数了。所以循环的步长可以设为 6,然后每次只判断 6 两侧的数即可。
//判断是否为质数
bool isPrime(int num) {
if (num <= 3) {
return num > 1;// 1不是质数,2、3是质数
}
// 不在6的倍数两侧的一定不是质数
if (num % 6 != 1 && num % 6 != 5) {
return false;
}
for (int i = 5; i <= sqrt(num); i += 6) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
}
return true;
}
排序
自定义比较函数
sort
sort(nums.begin(), nums.end(), cmp);
// sort 默认是递增排序, 可自定义比较函数cmp
qsort
进制
二进制数
转换
十进制数转换为二进制
//使用bitset转换二进制
#include 〈bitset〉
void BinaryBitset(int n)
{
cout<<bitset〈sizeof(int)*8〉(n)<<endl;
}
//使用容器转换二进制
#include <list>
void BinaryVector(int n)
{
int temp;
temp=n;
list<int> L;
while(temp!=0)
{
L.push_front(temp%2);
temp=temp>>1;
}
for (list<int>::iterator iter=L.begin();iter!=L.end();iter++ )
cout<<*iter;
}
N进制数
输入输出
cin 和cout
cout<<hex<<num; //十六进制
cout<<dec<<num; // 十进制
cout<<oct<<num; // 八进制
cin>>hex>>num; //十六进制
// 十六进制字母变大写
#include <iomanip>
cout << setiosflags(ios::uppercase) << hex << num;
printf 和scanf
%d: 十进制 %o: 八进制 %x 16进制
int num = 10;
printf("%d\n", num); //10
printf("%X\n", num); //A
printf("%x\n", num); //a
printf("%08x\n", num); //0000000a
转换
sprintf
char str[20];
int n = 10;
sprintf(str, 20, "%x", n);
c++: string和进制数字转换方法(16进制为例):
int StringToHex(const string& s)
{
istringstream i(s);
int x;
if (i >>hex>> x)
return x;
return -1; // if error
}
string HexToString(int x)
{
ostringstream o;
if (o <<hex<< x)
return o.str();
return "conversion error";
}
运算
// 16 进制加法
string addhex(string m) {
string r = string(m.rbegin(), m.rend());
int res = StringToHex(m) + StringToHex(r);
return HexToString(res);
}
// 2<=N<<10 进制加法
string add(string m,string r,int n) {
string res;
int c = 0;
for (int i = 0; i < m.length(); i++) {
int temp = (m[i] - '0') + (r[i] - '0')+c;
res+=(temp% n+'0');
c = temp / n;
}
if(c!=0)
res += (c + '0');
reverse(res.begin(),res.end());
return res;
}
转换
字符数组的转换
s.c_str()
: 将字符串转换为字符数组
数字转换
十进制转换:
# include<iostream>
# include <string>
# include <sstream>
using namespace std;
//c++: 将数值转化为string
string convertToString(double x)
{
ostringstream o;
if(o<<x)
return o.str();
return "conversion error";
}
//c++: 将string转化为数值
double convertFromString(const string &s)
{
istringstream i(s);
double x;
if(i>>x)
return x;
return 0.0; // if error
}
//c: 将数值转化为string
char b[10];
string a;
sprintf(b,"%d",1975);
a=b;
十六进制转换
int StringToHex(const string& s)
{
istringstream i(s);
int x;
if (i >>hex>> x)
return x;
return -1; // if error
}
string HexToString(int x)
{
ostringstream o;
if (o <<hex<< x)
return o.str();
return "conversion error";
}