软件开发训练 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;
}
时间: 2024-10-25 20:24:49

软件开发训练 OJ 练习的相关文章

软件开发训练 OJ 练习02

字符串IP地址判断 描述:判断输入的字符串是不是一个有效的IP地址 接口:boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false 无效的IP地址 约束: 输入IP为 XXX.XXX.XXX.XXX 格式 字符串两端含有空格认为是合法IP 字符串中间含有空格认为是不合法IP 类似于 01.1.1.1, 1.02.3.4 IP子段以0开头为不合法IP 子段为单个0 认为是合法IP,0.0.0.

让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机 "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用户使用.版本升级和后期维护等长期过程中,只有易读.易维护的软件代码才具有生命力. 在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易.更有甚者,有些项目组为了赶进度,明确要求组员以实现产品功能为主,代码能

软件开发有多少种方式

软件开发有多少种方式: Build To Learn Build To Show Build To Serve Build To Win 其中Build To Win是我们所学习的构建之法中的核心思想.软件开发是为了什么,是为了市场.赢得了市场,就是这个软件最大的成功.当然一个软件能够成功.就需要在工作中一视同仁,不能有高低贵贱之分.听取小组中每位成员的建议.并且每位程序员也能有很强的工作能力,所以我们必须要在平时的学习在加强对工作能力的训练.为未来的就业打好基础!

小议敏捷软件开发与传统软件工程

敏捷软件开发与传统软件工程 一.前言 随着社会和科技的不断发展,信息产业己经和人们的生活息息相关,成为不可或缺的一部分.软件工程作为信息产业的核心部分发生了翻天覆地的变化.传统的软件工程思想己经越来越不适应快速变化的信息社会,为此一种新软件工程思想-----敏捷软件开发进入了我们的视野. 二.软件工程 (一)概述 Software engineering is the application of engineering to the design, development, implement

你真的适合做软件开发吗

前段时间一个朋友跟我说,他说做软件开发不仅累,而且从来不跟人接触,整天要对着电脑研究代码.整个人都完全脱离社会了,自己都快变成代码了. 我笑着以一个过来人的身份对他说,你现在后悔了吧?!天下没有后悔的药,若想不后悔,就必须对将来要做的事情有个了解,这就好比商人投资某个项目一样,必须做好深入的考察后,才能进入,否则就凭着一腔热情,失败在所难免. 软件开发行业曾一度被各大媒体报渲染我21世纪的昭阳产业,人才缺口达到多少多少等等.听的大家是蠢蠢欲动,摩拳擦掌恨不得卯足劲冲进去好好干一番事业.然后各种媒

软件开发模式,DevOps

参考文献:http://www.cnblogs.com/jetzhang/p/6068773.html 历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出开发者,前台工程师,后台工程师之类)这个称号存在的历史进行一下回顾. 如编程之道中所言: 老一辈的程序员是神秘且深奥的.我们没法揣摩他们的想法,我们所能做的只是描述一下他们的表象. 清醒的像一只游过水面的狐狸 警惕的像一位战场上的将军 友善的像一位招待客人的女主人 单纯的像一块未经雕琢的木头 深邃的

Atitit。 沉思录 与it软件开发管理中的总结 读后感

Atitit. 沉思录 与it软件开发管理中的总结 读后感 1. <沉思录>,古罗马唯一一位哲学家皇帝马可·奥勒留所著 2 2. 沉思录与it软件开发管理中的总结 2 2.1. 要有自己的培训..(不要总是依靠公共图书馆) 2 2.2. 要做大架构,优先大架构 2 2.3. 各司其职 世间万物各有所用,各司其职 2 2.4. 优秀的培训不一定能造就出强大的成员...但总比没有强 2 2.5. 顺势而为,随遇而安. 2 2.6. 看穿生死,淡泊名利. 2 2.7. 保持理智,洞察世事 2 2.8

软件开发模型

作为一名程序员,开发过程就是一个最好的学习过程,在开发的过程中,不断寻找新的解决办法,学习新的开发技术,能更好的开阔我们的思路,让我们不断的进步. 临近毕业,着手准备毕业设计,我决定做一个在线考试系统,预计4月底完工,花费这么久来做这个项目,主要是因为,我要利用这个项目,将自己大学四年,学到的,没学到的东西 进行一次重新学习,第一站,软件开发模型. 软件开发模型(software development model)是指软件开发的整个过程,包括需求,设计,开发(写代码),测试,甚至是维护有时候也

ThoughtWorks、Teambition、Trello、Slack、DevCloud 主流敏捷软件开发工具平台比较

在大公司做了6年程序员,2年项目经理的小王,正在创业公司迎来他焦虑的而立之年. 但是对于3个月前加入创业公司的决定,他现在有些烦躁和怀疑人生.在他过往的经验看来,公司新接的小项目,在过去的大公司里1个月就该交付了.现在已经3个月了,工作.生活一切好像都乱了套,虽说对创业有心理准备,但是这些在他看来都不应该成为问题-- ? CEO低估了项目难度,在客户面前满口答应1个月交付没问题 ? 对软件版本缺乏有效的管理 ? 各语言代码检查,安装各种工具和插件,不胜其烦 ? 半路接手项目,开发环境和架构大换血