C++编程技巧—— 常用技巧和模板

输入输出

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";
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyw2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值