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. 二进制转换成十进制
暂时未做