#include<iostream> usingnamespace std; voidquick_sort(int q[], int l, int r){ //递归的终止情况 if (l >= r) return; //选取分界线。这里选数组中间那个数 int i = l - 1, j = r + 1, x = q[(l + r) /2]; //划分成左右两个部分 while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i < j) swap(q[i], q[j]); } //对左右部分排序 quick_sort(q, l, j), quick_sort(q, j + 1, r); } intmain(){ int a[5]={9,2,4,7,1}; quick_sort(a,0,4); for(int i=0;i<5;i++) cout<<a[i]<<" "; return0; }
voidisComposite(int num){ int x[1000]; int ans = 0,count=0; if (num < 2) return ; memset(x, 0, sizeof(x)); for (int i = 1; i <= num / 2; i++) { if (num % i == 0) { ans += i; count++; x[count] = i; } } if (ans == num){ cout << ans << "="; for (int i = 2; i <= count; i++){ cout << x[i-1]<< "+"; if (i == count){ cout << x[count]; } } cout << endl; } }
intmain(){ cout << "2000 以内的合数是:" << endl; for (int i = 1; i <= 2000; i++) { isComposite(i); } return0; }
精简版
//这个是直接输出结果,不输出因子 #include<iostream> #include<cstring> usingnamespace std; voidisComposite(int num){ int ans = 0; for (int i = 1; i <= num / 2; i++) if (num % i == 0) ans += i; if (ans == num) cout << ans << endl; }
intmain(){ cout << "2000 以内的合数是:" << endl; for (int i = 1; i <= 2000; i++) { isComposite(i); } return0; }
#include<iostream> usingnamespace std; intfun2(int num){//求num的阶乘 int sum = 1; for (int i = 1; i <= num; i++){ sum *= i; } return sum; }
intfun(int n, int m){ //求阶乘函数 int ret = fun2(n); int dat = fun2(m); int un = fun2(n - m); //公式:C(n, m ) = (n)!/ [(m)!(n - m)!] return ret / (dat * un); }
intmain() { int n = 0; cin>>n; //这里i和j要从1开始,否则公式就会出现求负数的阶乘 for (int i = 1; i <= n; i++){ // 输出空格可以不要 // for (int k = 0; k < (n - i); k++){ // cout << " "; //输出每行前面的空格 // } for (int j = 1; j <= i; j++){ int C = fun(i - 1, j - 1);//利用公式求每个元素 cout<<C<<" "; } cout<<endl; } return0; }
桥本分数式背代码
#include<iostream> usingnamespace std; int sum = 0; voidrecursion(int i, int a[]){ if (i == 10) {// int m1 = a[2] * 10 + a[3]; int m2 = a[5] * 10 + a[6]; int m3 = a[8] * 10 + a[9]; if (a[1] * m2 * m3 + a[4] * m1 * m3 == a[7] * m1 * m2) { sum++; cout << a[1] << " / " << m1 << " + " << a[4] << " / " << m2 << " = " << a[7] << " / " << m3 << endl; } return; } for (int t = 1; t < 10; t++) { bool flag = true; // 这段代码用于检查当前数字t是否在数组a的前面已经出现过。如果出现过,则将flag设置为false,表示当前数字t无法作为解的一部分。通过这个步骤可以排除重复的数字。 for (int j = i - 1; j > 0; j--) { if (a[j] == t) { flag = false; break; } } // 前面的数字没有重复的 if (flag) { a[i] = t; recursion(i + 1, a); } } }
intmain(){ int a[10] = {0}; recursion(1, a); cout << "\n\t总计有" << sum << "种解!" << endl; return0; }
数字游戏
#include<iostream> usingnamespace std; int sum = 0; voidrecursion(int i, int a[]){ if (i == 10) {// int m1 = a[1] * 10 + a[2]; int m2 = a[4] * 100 + a[5]*10+a[6]; int m3 = a[8] * 10 + a[9]; if (a[3]!=1&&a[7]!=1) { if (m1 * a[3] + m2 / a[7] == m3) { sum++; cout << m1 << " * " << a[3] << " + " << m2 << " / " << a[7] << " - " << m3<<" == 0 " << endl; } } return; } for (int t = 1; t < 10; t++) { bool flag = true; // 这段代码用于检查当前数字t是否在数组a的前面已经出现过。如果出现过,则将flag设置为false,表示当前数字t无法作为解的一部分。通过这个步骤可以排除重复的数字。 for (int j = i - 1; j > 0; j--) { if (a[j] == t) { flag = false; break; } } // 前面的数字没有重复的 if (flag) { a[i] = t; recursion(i + 1, a); } } }
intmain(){ int a[10] = { 0 }; recursion(1, a); cout << "\n\t总计有" << sum << "种解!" << endl; return0; }
intmain(){ int a, b; cout << "请输入两个数,分子与分母 :"; cin >> a >> b; while (a != 0) { int k = (b + a - 1) / a; // 向上取整 cout << "1/" << k << " "; a = a * k - b; b = b * k; } return0; }
voidGreedySelector(int n, int s[], int f[], bool A[]){ A[1]=true;//默认将第一个活动先安排 int j=1;//记录最近一次加入A中的活动 for (int i=2;i<=n;i++){//依次检查活动i是否与当前已选择的活动相容 if (s[i]>=f[j]){//下一活动的开始时间晚于之前活动的结束时间 A[i]=true;//标记该活动是可安排的 j=i; } else{ A[i]=false;//标记该活动是不可安排的 } } }
intmain(){ int s[] = {0,1,3,0,5,3,5,6,8,8,2,12}; //下标从1开始,存储活动开始时间 int f[] = {0,4,5,6,7,8,9,10,11,12,13,14}; //下标从1开始,存储活动结束时间 bool b[N+1];//存储被安排的活动编号 cout<<"各活动的开始时间,结束时间分别为:"<<endl; for(int i=1;i<=N;i++){ cout<<"["<<i<<"]:"<<"("<<s[i]<<","<<f[i]<<")"<<endl; }
这段代码是一个经典的 N 皇后问题的解法。在一个 N × N 的棋盘上,放置N个皇后,使得它们互相之间不能攻击到对方。其中,皇后可以攻击同一行、同一列以及同一对角线上的其他皇后。 代码使用深度优先搜索(DFS)的思想进行求解。通过递归的方式,依次尝试在每一行放置皇后,保证每一行只有一个皇后,并且满足不被其他皇后攻击的 条件。具体实现中使用了三个辅助数组 col、dg 和 udg 来标记列、正对角线和反对角线上的位置是否已经放置了皇后。 在搜索过程中,如果成功放置了 N 个皇后,即找到了一种合法的摆放方式,就输出棋盘的情况,并将结果数量 res 加一。最终输出结果的个数。 这段代码可以帮助解决 N 皇后问题,对于给定的 N 值,求出所有合法的摆放方式,并统计结果的数量。
// N 皇后问题 #include<iostream> #include<cstring> usingnamespace std;
constint N = 20;
int n; int res; char g[N][N]; bool col[N], dg[N], udg[N];
voiddfs(int u){ if (u == n){ for (int i = 0; i < n; i++) cout<<g[i]<<endl; cout<<endl; res++; return; } for (int i = 0; i < n; i++) if (!col[i] && !dg[u + i] && !udg[n - u + i]){ g[u][i] = 'Q'; col[i] = dg[u + i] = udg[n - u + i] = true; dfs(u + 1); col[i] = dg[u + i] = udg[n - u + i] = false; g[u][i] = '.'; } }
intmain(){ // cin >> n; n=8;
for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) g[i][j] = '.'; dfs(0); cout<<"总共有"<<res<<"个结果"; return0; }
在这段代码中,`dg`和`udg`分别表示主对角线和副对角线上是否存在皇后。 在棋盘上,每个格子可以通过行号和列号来表示,主对角线上的格子具有相同的行号减去列号,而副对角线上的格子具有相同的行号加上列号。 在代码中,`dg[u + i]`表示当前处理的行`u`和列`i`所在的主对角线,而`udg[n - u + i]`表示当前处理的行`u`和列`i`所在的副对角线。 对于每个格子`(u, i)`,如果在主对角线上已经存在皇后,则`dg[u + i]`的值为`true`,否则为`false`。同样地,如果在副对角线上已经存在皇后,则`udg[n - u + i]`的值为`true`,否则为`false`。 在回溯算法中,当我们选择一个格子放置皇后时,需要标记相应的主对角线和副对角线上已经存在皇后,以便在后续的递归过程中判断某个格子是否可放置皇后。