// 浮点数转二进制 #include<bits/stdc++.h> using namespace std; voidejz(int n)// 将整数转换为二进制 { int sum = 0; int y, x = 1; while (n != 0) { y = n % 2; sum += x * y; x *= 10; n /= 2; } cout << sum; } voidejzz(double n)// 将小数转换为二进制 { double r, m; int k; for (k = 1; k <= 20; k++) { r = n * 2; putchar((int)r == 0 ? '0' : '1'); m = r - (int)r; n = m; if (n <= 1e-6) break; } return; } intmain() { double a; cin >> a; int zs = int(a); // 浮点数拆分成整数和小数 double xs = a - zs; ejz(zs); cout << "."; ejzz(xs); return0; }
for(int i = 0; i < n -1; i++){ for(int j = i + 1; j < n; j++){ if(a[j] < a[i]){ int p = a[i]; a[i] = a[j]; a[j] = p; } } }
//进阶:双端选择排序(1) #include<bits/stdc++.h> using namespace std; intmain() { int n; cin>>n; for(int i=0;i<n;i++) //读入 int begin=0; int end=n-1; while(begin<end) { int max=begin; int min=begin; int i=0; for(i=begin+1;i<=end;i++) { if(a[i]<a[min]) min=i; if(a[i]>a[max]) max=i; } swap(a[begin],a[min]); if(begin==max) max=min; //如果max的位置与begin重合,则begin先与min的位置交换,此时max位置的最大值被交换走,导致 swap(a[end],a[max]); //end与max交换的数值是错误的 begin++; end--; } return0; }
//进阶:双端选择排序(2) //输入说明 //第一行输入一个正整数n<=1000,表示第二行的整数数目 //第二行输入n个整数,空格隔开 //第三行输入一个大于等于0的整数m,表示几趟排序 #include<iostream> using namespace std; intmain() { int n,p; cin>>n; int *a = new int [n]; for(int i=0;i<n;i++) cin>>a[i]; cin>>p; int left=0; int right=n-1; while(p--&&left<right) { for(int i=left;i<=right-1;i++) if(a[i]>a[i+1]) swap(a[i],a[i+1]); right--; for(int i=right;i>=left+1;i--) if(a[i]<a[i-1]) swap(a[i],a[i-1]); left++; } for(int i=0;i<n;i++) cout<<a[i]<<" "; delete [] a; a=NULL; return0; }
插入排序
二分查找
代码展示(加1还是减1,是小于还是小于或等于视具体情况而定)
一般来说l<=r与r=mid-1一起使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
intfind(int x) { int l = 1, r = n + 1; while (l < r) { int mid = l + (r - l) / 2; // 有时l+r可能超过int类型的极限 if (a[mid] >= x) r = mid; else l = mid + 1; } if (a[l] == x) return l; else return-1; }
洛谷P2249 【深基13.例1】查找
题目描述
输入 n 个不超过 10^9 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1,a2,···,an,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1 。
输入格式
第一行 2 个整数 n 和 m,表示数字个数和询问次数。 第二行 n 个整数,表示这些待查询的数字。 第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
#include<iostream> using namespace std; int n, m, a[1000005]; intfind(int x) { int l = 1, r = n; while (l < r) { int mid = (l + r) >> 1; if (a[mid] >= x)r = mid; else l = mid + 1; } if (a[l] == x)return l; elsereturn-1; } intmain() { cin >> n >> m; int tmp; for (int i = 1; i <= n; i++)cin >> a[i]; for (int i = 0; i < m; i++) { cin >> tmp; cout << find(tmp) << " "; } system("pause"); return0; }
杨辉三角(三种实现方式)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//1. 简单相加 a[i][j]=a[i-1][j-1]+a[i-1][j];
//2. 递归实现 longlongf(int a,int b) { if(b==0 or a==b) return1; return f(a-1,b-1)+f(a-1,b); }
//3. 排列数 longlongf(int a,int b) { if(b==0 or a==b) return1; longlong ans=1; for(int fm=1,fz=a;fm<b;fm++,fz--) ans=ans*fz/fm; return ans; }
#include<iostream> #include<algorithm> using namespace std; structnode { int val, num; }; intgcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } boolcmp(node a, node b)//按因子个数从大到小排序,如果个数一样,则按因子本身从大到小排序 { if (a.num != b.num) return a.num > b.num; return a.val > b.val; } intmain() { int n, a, c; cin >> n; cin >> a; for (int i = 2; i <= n; i++) { cin >> c; a = a * c / gcd(a, c); //求多个数的最小公倍数 } cout << a << endl; node b[1000]; int t = 0, k = 2; while (a != 1) //求质数因子 { int num = 0; while (a % k == 0) { num++; a /= k; } if (num > 0) { b[t].val = k; b[t].num = num; t++; } k++; } sort(b, b + t, cmp); cout << b[0].val << ": " << b[0].num; for (int i = 1; i < t; i++) { cout << ", " << b[i].val << ": " << b[i].num; } return0; }
boolisSXH(int a) { int tmp=a; int num=0; int sum=0; while(tmp!=0){ tmp/=10; num++; } tmp=a; while(a!=0){ int t=a%10; int d=pow(t,num); sum+=d; a/=10; } return sum==tmp; }