首页
统计
留言
友链
更多
关于
推荐
B站主页
私有网盘
WP分站
ZBlog分站
聚合图床
企业邮箱
地大官网
Search
1
C++ 最大公约数函数__gcd()的用法及其朴素实现
710 阅读
2
一文弄懂搜索算法中的DFS和BFS
309 阅读
3
WordPress 博客主题推荐
228 阅读
4
C++ 中的各种进制转换函数汇总
194 阅读
5
C++ 中 using 的用法
179 阅读
笔记
教程
资源
网站
转载
登录
Search
标签搜索
C++
算法
网站
WordPress
资源
编程
全排列
进制转换
搜索
DFS
BFS
博客
STL
主题
张再筵
累计撰写
8
篇文章
累计收到
7
条评论
首页
栏目
笔记
教程
资源
网站
转载
页面
统计
留言
友链
关于
推荐
B站主页
私有网盘
WP分站
ZBlog分站
聚合图床
企业邮箱
地大官网
搜索到
8
篇与
的结果
2022-02-03
C++ 中的各种进制转换函数汇总
一,指定格式输出1.在C中,按指定进制格式输出如下,printf("%05o\n",35); //按八进制格式输出,保留5位高位补零 printf("%03d\n",35); //按十进制格式输出,保留3位高位补零 printf("%05x\n",35); //按十六进制格式输出,保留5位高位补零2.在C++中,按指定进制格式输出如下,#include <bitset> #include<iostream> using namespace std; int main() { cout << "35的8进制:" << std::oct << 35<< endl; cout << "35的10进制:" << std::dec << 35 << endl; cout << "35的16进制:" << std::hex << 35 << endl; cout << "35的2进制:" << bitset<8>(35) << endl; //<8>:表示保留8位输出 return 0; }二,C/C++各种进制转换库函数一)任意2-36进制数转化为10进制数。建议自己写函数,代码如下:int Atoi(string s,int radix) //s是给定的radix进制字符串 { int ans=0; for(int i=0;i<s.size();i++) { char t=s[i]; if(t>='0'&&t<='9') ans=ans*radix+t-'0'; else ans=ans*radix+t-'a'+10; } return ans; } 1.strtol()函数() 函数原型:long int strtol(const char nptr, char *endptr, int base) base是要转化的数的进制,非法字符会赋值给endptr,nptr是要转化的字符,例如: #include<cstdio> int main() { char buffer[20]="10549stend#12"; char *stop; int ans=strtol(buffer, &stop, 8); //将八进制数1054转成十进制,后面均为非法字符 printf("%d\n",ans); printf("%s\n", stop); return 0; } 输出结果:5569stend#12 注意: ①如果base为0,且字符串不是以0x(或者0X)开头,则按十进制进行转化。 ②如果base为0或者16,并且字符串以0x(或者0X)开头,那么,x(或者X)被忽略,字符串按16进制转化。 ③如果base不等于0和16,并且字符串以0x(或者0X)开头,那么x被视为非法字符。 ④对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符。二)将10进制数转换为任意的n进制数,结果为char型。建议自己写,代码如下:string intToA(int n,int radix) //n是待转数字,radix是指定的进制 { string ans=""; do{ int t=n%radix; if(t>=0&&t<=9)ans+=t+'0'; else ans+=t-10+'a'; n/=radix; }while(n!=0);//使用do{}while()以防止输入为0的情况 reverse(ans.begin(),ans.end()); return ans; } 1.itoa()函数(可以将一个10进制数转换为任意的2-36进制字符串) 函数原型:char*itoa(`int value,char*string,`int radix); 例如:itoa(num, str, 2); num是一个int型的,是要转化的10进制数,str是转化结果,后面的值为目标进制。#include<cstdio> #include<cstdlib> int main() { int num = 10; char str[100]; _itoa(num, str, 2); //c++中一般用_itoa,用itoa也行, printf("%s\n", str); return 0; }2.sprintf()函数(可以将一个10进制数转换为指定格式的n进制字符串)函数原型:int sprintf( char buffer, const char format, [ argument] … );#include<cstdio> int main() { char s[100]={0}; sprintf(s, "%d", 123); //十进制输出产生"123" sprintf(s, "%4d%4d", 123, 4567); //指定宽度不足的左边补空格,产生:" 1234567" sprintf(s, "%8o", 123);//八进制输出,宽度占8个位置 sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐 sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142" int i = 100; sprintf(s, "%.2f", i);//注意这是不对的 sprintf(s, "%.2f", (double)i);//要按照这种方式才行 return 0; }三)使用字符串流stringstream(头文件#include<sstream>) 1.将八,十六进制转十进制。#include<iostream> #include<string> #include<sstream> using namespace std; int main(void) { string s="20"; int a; stringstream ss; ss<<hex<<s; //以16进制读入流中 ss>>a; //10进制int型输出 cout<<a<<endl; return 0; } //输出:322.将十进制转八,十六进制。#include<cstdio> #include<iostream> #include<string> #include<sstream> using namespace std; int main(void) { string s1,s2; int a=30; stringstream ss; ss<<oct<<a; //10进制转成八进制读入流中,再以字符串输出 ss>>s1; cout<<s1<<endl; //输出:36 ss.clear();//不清空可能会出错。 ss<<hex<<a; //10进制转成十六进制读入流中,,再以字符串输出 ss>>s2; cout<<s2<<endl; //输出:1e return 0; }
2022年02月03日
194 阅读
0 评论
0 点赞
2022-01-31
C++ 中全排列枚举的几种实现方式
1.DFS(使用递归与回溯实现)对于普通数组Array,这里给出函数模板形式:#include<bits/stdc++.h> using namespace std; template<class T> void func(T* arr, int total, int k = 0) //轮流更换第n位和n到total-1位 { for (int i = k; i < total; i++) { if (k == total - 1) //在此对排列好的数组进行下一步操作 { for (int p = 0; p < total; p++)cout << arr[p]; cout << "\n"; return; } {T t = arr[i]; arr[i] = arr[k]; arr[k] = t; }//swap(a[k],a[i]); func(arr, total, k + 1); {T t = arr[i]; arr[i] = arr[k]; arr[k] = t; } } } int main() { int arr[]{ 1,2,3,4,5 }; func(arr, 5); char crr[] = "ABCDEFG"; func(crr, 4); return 0; }对于字符串,则可跳过回溯步骤,相应地,空间复杂度将由O(1)提升至O( n! ),具体实现如下:#include<bits/stdc++.h> using namespace std; void f(string& str, int n = 0) { if (n == str.size() - 1)cout << str << endl; //在此对排列好的数组进行下一步操作 for (int i = n; i < str.size(); ++i) { string ts = str; auto t = ts[i]; ts[i] = ts[n]; ts[n] = t; f(ts, n + 1); } } int main() { return 0; string str = "1234567890"; f(str); return 0; }2.调用 algorithm.h 中的next_permutation ()函数伪代码如下:do { // todo } while (next_permutation(a, a + n));其中a为数组首地址,n为数组大小;对于string或vector,在参数中传入首末迭代器即可。
2022年01月31日
131 阅读
0 评论
0 点赞
2022-01-30
C++ 最大公约数函数__gcd()的用法及其朴素实现
C++的标准库中提供了一些实用的函数,比如:__gcd(x,y)函数 用于求x,y的最大公约数其中x,y不能是浮点数头文件:#include;用法:#include<iostream> #include<algorithm> using namespace std; int main() { int a,b; cin>>a>>b; cout<<__gcd(a,b)<<endl; }朴素实现方法:算法的本质是辗转相除:1.普通循环int gcd(int x,int y) { int r; while (a%b!=0) { r=a%b; a=b; b=r; } return b; }2.递归+三元运算符int gcd(int a,int b) { return b>0 ? gcd(b,a%b):a; }3.递归+ if 语句求x 和 y 的最大公约数,就是求 y 和 x % y 的最大公约数int gcd(int a,int b) { if(a%b==0) return b; else return (gcd(b,a%b)); }
2022年01月30日
710 阅读
0 评论
0 点赞
1
2