首页 > 代码库 > 软件开发训练 OJ 练习
软件开发训练 OJ 练习
Game 24点游戏算法
问题:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
输入:4个1-10的数字。[数字允许重复,测试用例保证无异常数字]
输出:True or False
#include <iostream> #include <stdlib.h> #include <string.h> #include <stdio.h> using namespace std; void cal(double re[6], double a, double b) { re[0] = a + b; re[1] = a - b; re[2] = b - a; re[3] = a * b; re[4] = a * 1.0 / b; re[5] = b * 1.0 / a; } bool is24Points(double a, double b) { double re[6]; cal(re, a, b); int i; for (i = 0; i < 6; ++i) { if (re[i] == 24) { return true; } } return false; } void calThree(double re[108], double a, double b, double c) { int i, j, k; k = 0; double fi[6]; double tt[6]; cal(fi, a, b); for (i = 0; i < 6; ++i) { cal(tt, fi[i], c); for (j = 0; j < 6; ++j) { re[k++] = tt[j]; } } cal(fi, a, c); for (i = 0; i < 6; ++i) { cal(tt, fi[i], b); for (j = 0; j < 6; ++j) { re[k++] = tt[j]; } } cal(fi, b, c); for (i = 0; i < 6; ++i) { cal(tt, fi[i], a); for (j = 0; j < 6; ++j) { re[k++] = tt[j]; } } } bool Game24Points(int a, int b, int c, int d) { double re[108]; int i; calThree(re, b, c, d); for (i = 0; i < 108; i++) { if (is24Points(re[i], a)) return true; } calThree(re, a, c, d); for (i = 0; i < 108; i++) { if (is24Points(re[i], b)) return true; } calThree(re, a, b, d); for (i = 0; i < 108; i++) { if (is24Points(re[i], c)) return true; } calThree(re, a, b, c); for (i = 0; i < 108; i++) { if (is24Points(re[i], d)) return true; } return false; } int main() { cout << Game24Points(1, 2, 3, 4) << endl; cout << Game24Points(7, 2, 1, 10) << endl; cout << Game24Points(7, 7, 7, 7) << endl; return 0; }
周期串问题
问题:如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3)。字符串的长度小于等于100,由调用者保证。
接口: int GetMinPeriod(char *inputstring)
输入: char * inputstring 字符串
返回: int 字符串最小周期
int GetMinPeriod(char *inputstring) { /*在这里实现功能*/ int i, j; int len = strlen(inputstring); int result = len; for (i = 1; i < len / 2 + 1; i++) { for (j = 0; j < len - i; j++) { if (inputstring[j] != inputstring[j + i]) break; } if (j == len - i) { result = i; break; } } return result; }
删除重复字符
问题:给定一个字符串,将字符串中所有和前面重复多余的字符删除,其余字符保留,输出处理后的字符串。需要保证字符出现的先后顺序,并且区分大小写。
接口:int GetResult(const char *input, char *output)
输入:input
输入字符串 输出:output
输出字符串
返回:0 成功 -1 失败及异常
#include <map> #include <iostream> using namespace std; int GetResult(const char *input, char *output) { if (input == NULL || output == NULL) return -1; map<char, int> m; const char *p = input; while (*p) { m.insert(map<char, int>::value_type(*p, 0)); p++; } p = input; char *p2 = output; while (*p) { m[*p]++; if (m[*p] == 1) { *p2++ = *p; } p++; } *p2 = '\0'; return 0; } int main() { char *p = "aabbcdae"; char *ou = (char *) malloc(1000); GetResult(p, ou); cout << ou << endl; }
N皇后
问题:皇后是国际象棋中威力最大的棋子。在下面所示的棋盘上,皇后可以攻击位于箭头所覆盖位置的所有棋子。我们能不能把N个皇后放在棋盘(N×N)上,它们中的任何一个都无法攻击其余的皇后?请编写程序找出一共有几种方法。
接口:intPlaceQueenMethodNum(int n);
输入:int n
皇后的个数 返回:放置 n 皇后方案的个数
#include <stdio.h> #include <stdlib.h> #include <iostream> bool find(int row, int col, int *q) { int i = 1; while (i < row) { if (q[i] == col || abs(i - row) == abs(q[i] - col)) return false; i++; } return true; } void place(int row, int n, int *q, int *re) { if (row > n) { (*re)++; return; } int col; for (col = 1; col <= n; col++) { if (find(row, col, q)) { q[row] = col; place(row + 1, n, q, re); } } } int PlaceQueenMethodNum(int n) { int re = 0; int q[20]; place(1, n, q, &re); return re; } int main(){ std::cout<<PlaceQueenMethodNum(8); }
可怕的阶乘
问题:计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值。例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围。请设计一个程序,使其可以计算100以内的数的阶乘,结果用字符串的形式输出
接口:void CalcNN(int n, char *pOut)
输入:int n
需要输入的阶乘数
输出:char *pOut
结算结果,内存由调用者负责管理
#include <iostream> using namespace std; void CalcNN(int n, char *pOut) { int a[5000]; memset(a, 0, sizeof(a)); a[0] = 1; int i, j, k, len = 0; for (i = 1; i <= n; ++i) { for (j = 0; j <= len; ++j) a[j] *= i; for (j = 0; j <= len; ++j) { if (a[j] < 10) continue; k = j; while (k <= len) { if (a[len] > 9) ++len; a[k + 1] += a[k] / 10; a[k] %= 10; ++k; } } } char *p = pOut; for (i = len; i >= 0; --i) { *p++ = '0' + a[i]; } *p = '\0'; return; } int main() { char *p = (char *) malloc(1000); CalcNN(13, p); cout << p; }
软件开发训练 OJ 练习