算法竞赛入门经典_第2版-课后习题-第二章

C++语言版实现代码

习题2-1 水仙花数(daffodil)
输出100~999中的所有水仙花数。若3位数ABC满足 A B C = A 3 + B 3 + C 3 ABC=A^{3}+B^{3}+C^{3} ABCA3B3C3,则称其为水仙花 数。例如 153 = 1 3 + 5 3 + 3 3 153=1^{3}+5^{3}+3^{3} 153135333,所以153是水仙花数。

#include "pch.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	int a, b, c, s;
	for (int i = 100; i < 1000; i++) {
		a = i / 100;
		b = (i - a * 100) / 10;
		c = i % 10;
		s = a * a*a + b * b*b + c * c*c;
		if (i == s)
			cout << i << " ";
	}

	return 0;
}

习题2-2 韩信点兵(hanxin)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组 数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c< 7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件 结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2: No answer

#include "pch.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	int a, b, c, flag, Case = 0;

	fstream infile("Text.txt", ios::in);
 
	while (infile >> a >> b >> c) {
		++Case;
		flag = 0;
		for (int i = 10; i < 101; i++) {
			if (i % 3 == a && i % 5 == b && i % 7 == c) {
				cout << "Case " << Case << ": " << i << endl;
				flag = 1;
			}
			if (i == 100 && flag == 0) {
				cout << "Case " << Case << ": No answer" << endl;
			}
		}
	}
	infile.close();

	return 0;
	
}

习题2-3 倒三角形(triangle)
输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
算法竞赛入门经典_第2版-课后习题-第二章_第1张图片

#include "pch.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	int n;
	cin >> n;
	for (int i = 5; i > 0; i--) {
		string str(i * 2 - 1, '#');
		cout << setw(2 * n - 1 - (n-i)) << str << endl;
	}

	return 0;
	
}

习题2-4 子序列的和(subsequence)
输入两个正整数n<m<106,输出 ,保留5位小数。输入包含多组数据, 结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001
题目理解:尝试将1/(n*n)转换为1/n/n的形式,可以避免溢出

#include "pch.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	int n, m, Case = 0;
	while (1) {
		cin >> n >> m;
		if (n == 0 && m == 0)
			break;
		else {
			float s = 0.0;
			while (n < m + 1) {
				stringstream sStream;
				float sub = 1.0 / n / n;
				s += sub;
				n++;
			}
			Case++;
			cout << "Case " << Case << ": " << fixed << setprecision(5) << s << endl;
		}
	}

	return 0;
}

习题2-5 分数化小数(decimal)
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a, b ≤ 1 0 6 b≤10^{6} b106,c≤100。输 入包含多组数据,结束标记为a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
题目理解:C++的没有可以满足100位数字的数据类型

#include "pch.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	int a, b, c, Case = 0;
	while (1) {
		cin >> a >> b >> c;
		if (a == 0 && b == 0 && c == 0)
			break;
		else {
			Case++;
			long double res = a * 1.0 / b;
			cout << "Case " << Case << ": " << fixed << setprecision(c) << res << endl;
		}
	}

	return 0;
}

习题2-6 排列(permutation)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必 太动脑筋。
题目理解:因为1-9都只能出现一次,那么abc,def,ghi的个十百位上数字必须满足和为45,积为362880,当同时满足这两个条件的abc,def,ghi,就是所求的abc,def,ghi。

#include "pch.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	int product = 1, sum = 0;
	for (int x = 1; x < 10; x++) {
		sum += x;
		product *= x;
	}
	int abc, def, ghi;
	for (int n = 123; n < 333; n++) {
		abc = n;
		def = n * 2;
		ghi = n * 3;
		int a = abc / 100;
		int b = (abc - a * 100) / 10;
		int c = abc % 10;
		
		int d = def / 100;
		int e = (def - d * 100) / 10;
		int f = def % 10;
		
		int g = ghi / 100;
		int h = (ghi - g * 100) / 10;
		int i = ghi % 10;

		int s = a + b + c + d + e + f + g + h + i;
		int p = a * b*c*d*e*f*g*h*i;

		if (s == sum & p == product) {
			cout << abc << " " << def << " " << ghi << endl;
		}
	}
	
	return 0;
}

你可能感兴趣的:(入门学习)