C++程序设计教程(钱能)第六章习题

1. 计算素数在素数集合中的排名

//prime.txt
2
4
6
5
13
#include <fstream>
#include <vector>
#include<bitset>
#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	vector<int> v(1000000, 0);
	bitset<1000000>*p = new bitset<1000000>;
	p->set();
	for (int i = 2; i <= 1000; ++i) {
		if (p->test(i)) {
			for (int j = i*i; j < p->size(); j += i)
				p->reset(j);
		}
	}
	int num = 0;
	for (int i = 2; i < 1000000; ++i) {
		if (p->test(i)) {
			num++;
			v[i] = num;
		}			
	}
	delete[]p;
	ifstream in("prime.txt");
	for (int num; in>>num; )
		cout << v[num] << endl;
}	

/*运行结果:
	1
	0
	0
	3
	6
*/

2. 无穷数列连成数串,求第i位

//string01.txt
5
4
3
14
7
6
#include <fstream>
#include<bitset>
#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	bitset<2147483648>*p = new bitset<2147483648>;
	int pos = 0;
	p->set(0);
	for (int i = 1; pos + i < 2147483648; i++) {
		pos += i;
		p->set(pos);
	}
	ifstream in("string01.txt");
	int n;
	in >> n;
	for (int num; in >> num; ) {
		cout << p->test(num - 1) << " ";
	}
	cout << endl;
}
	
/*运行结果:
	1 0 0 1 0
*/

3. 判断字串“可排列相等”

//permute.txt
Oh, my goodnessmultiple lines!
yg doo, shOmens emlusleip!tlin

perplexed
exdrelper
#include <fstream>
#include <sstream>
#include <algorithm>
#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	ifstream in("permute.txt");
	for (string s, t; getline(in, s) && getline(in, t); getline(in, s)) {
		sort(s.begin(), s.end());
		sort(t.begin(), t.end());
		/*cout << s << endl;
		cout << t << endl;*/
		cout << (s == t ? "Yes" : "No") << endl;
	}
	return 0;
}

/*运行结果:
	Yes
	No
*/

4. 求整数对的和及平均值

//average.txt
Oh, my goodnessmultiple lines!
yg doo, shOmens emlusleip!tlin

perplexed
exdrelper
#include <fstream>
#include <sstream>
#include <time.h>
#include <iostream>
using namespace std;

double getSum(int m, int n) {
	double s = 0;
	for (int i = m; i <= n; i++)
		s += i;
	return s;
}

int main(int argc, char** argv) {
	ifstream in("average.txt");
	int num1 = 0;
	double sum1 = 0;
	clock_t start = clock();
	for (int begin, end; in >> begin >> end; num1++)
		sum1 += getSum(begin, end);
	cout.precision(3);
	cout << fixed << sum1 / num1 << endl;
	cout << "耗时:" << clock() - start / double(CLK_TCK) << endl;

	ifstream cin("average.txt");
	int num = 0;
	double sum = 0;
	start = clock();
	for (int a, b; cin >> a >> b; ++num)
		sum += (a + b)*(b - a + 1) / 2;
	cout.precision(3);
	cout << fixed << sum / num << endl;
	cout << "耗时:" << clock() - start / double(CLK_TCK) << endl;
}
	
/*运行结果:
	168878.333
	耗时:55.945
	168878.333
	耗时:56.943
*/

5. 计算队员行列号

//team.txt
2
16 1 1 6 11
16 2 2 5 11
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	ifstream in("team.txt");
	int n = 0;
	in >> n;
	in.ignore();//滤去2后面的回车,以便之后能逐行读入。
	/*说明:
	  无in.ignore(),s值依次是""、16 1 1 6 11、16 2 2 5 11
	  有in.ignore(),s值依次是16 1 1 6 11、16 2 2 5 11
	*/
	int N, X, Y, R, M;
	for (string s; getline(in, s); ) {
		for (istringstream sin(s); sin >> N >> X >> Y >> R >> M; ) {
			if (X == 1 && Y == 1) {
				if (M%R)
					cout << M / R + 1 << " " << M%R << endl;
				else
					cout << M / R << " " << R << endl;
			}
			if (X == 1 && Y == 2) {
				if (M%R)
					cout << M%R << " " << M / R + 1 << endl;
				else
					cout << R << " " << M / R << endl;
			}
			if (X == 2 && Y == 1) {
				if ((2 * M - 1) % R)
					cout <<(2*M-1)/R+1<<" "<< (2 * M - 1) %R<< endl;
				else
					cout << (2 * M - 1) / R<<" "<< R <<endl;
			}
			if (X == 2 && Y == 2) {
				if ((2 * M - 1) % R)
					cout << (2 * M - 1) % R << " " << (2 * M - 1) / R + 1 << endl;
				else
					cout << R << " " << (2 * M - 1) / R  << endl;
			}
		}
	}
}

/*运行结果:
	2 5
	1 5
*/

6. 正弦字符图

//sin.txt
5 5 *
2 3 #
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;

struct Point { 
	int x, y; 
} zero = { 0,0 };

bool operator<(const Point& a, const Point& b) {
	return a.y > b.y;//降序
}

void display(const vector<Point>& p, char ch) {
	for (int k = 0, i = p[0].y; i >= -p[0].y; --i) {//从最大的y值开始,依次减1
		for (int n = 0; k < p.size() && p[k].y == i; n = p[k++].x + 1) //寻找y值相同的点,控制输出到一行上
			cout << string(p[k].x - n, ' ') << ch;
		//计算y值相同的两点间的空格数 
		//如当前x=3,下一个x=7。
		//3之前有3个空格,***|***| 3与7之间的空格数是4。
		cout << "\n";
	}
}

int main(int argc, char** argv) {
	ifstream cin("sin.txt");
	char ch;
	//period为T/4,amplitude为振幅
	for (int period, amplitude; cin >> period >> amplitude >> ch; ) {
		vector<Point>p(4 * period + 1, zero);//初始化为(0,0)
		for (int i = 1; i <= period * 2; ++i) {//利用中心对称,对1-10进行初始化的同时,给11-20初始化
			p[i].x = i;
			p[i].y = amplitude*sin(i*M_PI / 2 / period) + 0.5;//计算y值
			p[period * 2 + i].x = period * 2 + i;
			p[period * 2 + i].y = -p[i].y;
		}
		stable_sort(p.begin(), p.end());//稳定降序排列
		display(p, ch);//打印图形
	}
}

运行结果:
在这里插入图片描述

7. 判断对称文

//symmetry.txt
Madam
<madam>
ling 121 gnil
kkghkkhg
000000
#include <fstream>
#include <string> 
#include <algorithm>
#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	ifstream in("symmetry.txt");
	for (string s; getline(in, s); )
	{
		if (s == "000000")
			break;
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] >= 'A' && s[i] <= 'Z')
				s[i] += 32;
		}
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] == '{')
				s[i] = '}';
			if (s[i] == '<')
				s[i] = '>';
			if (s[i] == '(')
				s[i] = ')';
			if (s[i] == '[')
				s[i] = ']';
		}
		string t = s;
		reverse(s.begin(), s.end());
		cout << (s == t ? "" : "Not ") << "Symmetry" << endl;
	}
}
	
/*运行结果:
	Symmetry
	Symmetry
	Symmetry
	Not Symmetry
*/

8. 二进制转换成十进制

       暂时未做

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值