前言

C++作业,用C++写,在学

目录

5月

  • C语言2.2
  • 最小长方形
  • 字符统计
  • 动物简介(animal)

6月

  • C语言8.5

  • C语言10.28

  • 杀毒

  • 改写整数

  • 判断三角形形状

  • C语言6.16

  • 水仙花数

  • 数列3

开始

5月

题目A(C语言2.2)

题目描述

1
有50个学生,要求将他们之中成绩在80分(含)以上的学号和成绩输出。

输入

1
共有50行输入,每一行包含两个用空格隔开的整数,分别代表一个学生的学号和成绩。输入数据保证每个学生的成绩在0至100之间(包含0和100)。

输出

1
输出每一个成绩大于等于80分的学生的学号和成绩,每一个学生一行,用一个空格隔开学号和成绩。

样例输入 Copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
30100 90
30101 75
30105 72
30110 83
30108 79
30000 80
30001 75
30005 82
30010 93
30008 69
50100 76
50101 85
50105 72
50110 53
50108 79
50000 80
50001 75
50005 82
50010 73
50008 69
20100 70
20101 85
20105 72
20110 63
20108 79
20000 50
20001 75
20005 82
20010 93
20008 69
10100 60
10101 75
10105 72
10110 83
10108 79
10000 80
10001 75
10005 82
10010 93
10008 69
40100 79
40101 75
40105 72
40110 83
40108 79
40000 80
40001 75
40005 82
40010 93
40008 69

样例输出 Copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
30100 90
30110 83
30000 80
30005 82
30010 93
50101 85
50000 80
50005 82
20101 85
20005 82
20010 93
10110 83
10000 80
10005 82
10010 93
40110 83
40000 80
40005 82
40010 93

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>

using namespace std;

int main() {
int count = 0, count1 = 0;
int data[2][50];
for (int i=0;i<2;i++) {
for (int ii=0;ii<50;ii++) {
data[i][ii] = 0;
}
}
while (1) {
int data0 = 0;
int data1 = 0;
cin >> data0 >> data1;

if (data1 >= 80) {
data[0][count1] = data0;
data[1][count1] = data1;
count1++;
}
if (count == 4) {
break;
}
count++;
}

for (int i=0;i<count1;i++) {
cout << data[0][i];
cout << '\t';
cout << data[1][i] << endl;
}

return 0;
}

题目B(最小长方形)

题目描述

1
给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。

输入

1
测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标占一行,其中|x|和|y|小于 1000;一对0 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。

输出

1
对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。

样例输入 Copy

1
2
3
4
5
6
7
-41 35
26 45
13 30
0 0
-5 13
0 0
0 0

样例输出 Copy

1
2
-41 30 26 45
-5 13 -5 13

提示

1
我们可以发现横纵坐标的计算其实是独立的,对于每个坐标更新当前横纵坐标的最小值和最大值即可。

我的答案

一开始写了下面这个(平台报答案错误的

下面这个程序在测试的时候并无问题

传上去报答案错误(50),也就是只有部分答案是对的

后来发现一输入一次就得输出结果,我是全部输入完了才输出结果,晕

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>

using namespace std;

int main() {
int data[10000][2], udata[10000][2], count = 0;
int max_u, min_u, max_d, min_d;
int count1 = 0;
for (int i=0;i<10000;i++) {
for (int ii=0;ii<2;ii++) {
data[i][ii] = 9999;
udata[i][ii] = 9999;
}
}
while (1) {
int data0 = 0;
int data1 = 0;
cin >> data0 >> data1;
if (!(data0 < 1000 && data0 > -1000 && data1 < 1000 && data1 > -1000)) continue;
//if (data0 == 0 && data1 == 0 && count == 0) break;
if (data0 == 0 && data1 == 0) {
if (udata[count - 1][0] == 0 && udata[count - 1][1] == 0 && count != 0) {
break;
}

}
if (!(data0 == 0 && data1 == 0 && count == 0)) {
udata[count][0] = data0;
udata[count][1] = data1;
count++;
}

}

//for (int i=0;i<count;i++) cout << udata[i][0] << udata[i][1] << endl;
if (count == 1) return 0;

max_u = udata[0][1];
min_u = udata[0][0];
max_d = udata[0][0];
min_d = udata[0][1];

for (int i=0;i<count;i++) {
if (udata[i][0] != 0 && udata[i][1] != 0) {
if (udata[i][0] < min_u)
min_u = udata[i][0];
if (udata[i][1] > max_u)
max_u = udata[i][1];
if (udata[i][0] > max_d)
max_d = udata[i][0];
if (udata[i][1] < min_d)
min_d = udata[i][1];
} else {
data[count1][0] = min_u;
data[count1][1] = min_d;
data[count1+1][0] = max_d;
data[count1+1][1] = max_u;

if (i != count - 1) {
max_u = udata[i+1][1];
min_u = udata[i+1][0];
max_d = udata[i+1][0];
min_d = udata[i+1][1];
}

count1 += 2;
}
}
for (int i=1;i<=count1;i++) {
cout << data[i-1][0]<< ' ' << data[i-1][1];
if (i % 2 == 0) {
cout << endl;
} else {
cout << ' ';
}
}


return 0;
}

后来改成输入一组完成就立刻输出就过了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>

using namespace std;

int main() {
int data[10000][2], udata[10000][2], count = 0;
int max_u, min_u, max_d, min_d;
int count1 = 0;
for (int i=0;i<10000;i++) {
for (int ii=0;ii<2;ii++) {
data[i][ii] = 9999;
udata[i][ii] = 9999;
}
}
while (1) {
int data0 = 0;
int data1 = 0;
cin >> data0 >> data1;

if (!(data0 < 1000 && data0 > -1000 && data1 < 1000 && data1 > -1000)) continue;
//if (data0 == 0 && data1 == 0 && count == 0) break;
if (data0 == 0 && data1 == 0) {
max_u = udata[0][1];
min_u = udata[0][0];
max_d = udata[0][0];
min_d = udata[0][1];

for (int i=0;i<count;i++) {
if (udata[i][0] != 0 && udata[i][1] != 0) {
if (udata[i][0] < min_u)
{
min_u = udata[i][0];
}
if (udata[i][1] > max_u)
{
max_u = udata[i][1];
}
if (udata[i][0] > max_d)
{
max_d = udata[i][0];
}
if (udata[i][1] < min_d)
{
min_d = udata[i][1];
}

}
}
cout << min_u << ' ' << min_d << ' ' << max_d << ' ' << max_u;
cout << endl;
cin >> data0 >> data1;
if (data0 == 0 && data1 == 0) {
break;
}
count = 0;

}
if (!(data0 == 0 && data1 == 0 && count == 0)) {
udata[count][0] = data0;
udata[count][1] = data1;
count++;
}

}

return 0;
}

截图对比

放截图对比一下吧

第一次

第二次

题目C(字符统计)

题目描述

1
输入一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成),分别统计出其中大写英文字母,小写英文字母、阿拉伯数字和空格的个数。

输入

1
一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成)

输出

1
分别输出大写英文字母,小写英文字母、阿拉伯数字和空格的个数,用空格隔开

样例输入 Copy

1
h0u84nfx 7

样例输出 Copy

1
0 5 4 1

我的答案

程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <string>

using namespace std;

class string_check {
public:
void get_string(string user_ip) {
input_str = user_ip;
str_len = input_str.length();
char_in_str();
}
unsigned int sdigit() {
return digi_count;
}
unsigned int supper() {
return upper_count;
}
unsigned int slower() {
return lower_count;
}
unsigned int spass() {
return pass_count;
}
private:
string input_str = "";
unsigned int str_len = 0;
unsigned int digi_count = 0;
unsigned int upper_count = 0;
unsigned int lower_count = 0;
unsigned int pass_count = 0;

void char_in_str() {
const char *char_c = input_str.c_str();
for (int i=0;i<str_len;i++) {
if (*(char_c+i) == ' ') {
pass_count++;
} else if (isupper(*(char_c+i))) {
upper_count++;
} else if (islower(*(char_c+i))) {
lower_count++;
} else if (isdigit(*(char_c+i))) {
digi_count++;
}
}
}

};

int main() {
string user_input = "";
getline(cin, user_input);

string_check m;
m.get_string(user_input);
cout << m.supper() << ' ' << m.slower() << ' ' << m.sdigit() << ' ' << m.spass() << ' ' << endl;
return 0;
}

运行截图

题目D【动物简介(animal)】

题目描述

1
2
3
到了动物园,琦琦开心得跳起来。哗,这里好多动物呀,有老虎,有狮子……,在开心之余,琦琦也不忘妈妈的教导:观察动物时要认真仔细,还要看动物园附上的动物简介呀。
动物的简介原来还有英文版的呢!为了卖弄自己的英文水平,琦琦就告诉妈妈每张动物简介里出现了多少次该动物的名称。注意:琦琦只认识小写字母,而且她只认得动物的单词,因此她认为monkeys或者smonkey或者smonkeys都是出现了monkey这个词。
你能编程完成琦琦的任务吗?

输入

1
2
3
4
输入文件共n+2行:
第1行为数字n(n<=3000),表示该动物的简介共有n行。
第2行为一个单词,表示琦琦认识的动物名称。
接着是n行,每行为一个长度小于250个字符的字符串,表示动物的简介。

输出

 输出文件共1行,为简介里出现了多少次琦琦能识别出的动物的单词。

样例输入 Copy

1
2
3
4
2
snake
The snake is a long and thin animal.
Snakes have no legs or feet.

样例输出 Copy

1
1

我的答案

程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>

using namespace std;

class Homework {
public:
void input_times() {
getline(cin, lines_input);
}
void input_animal() {
getline(cin, str_target);
}
void input_description() {
animal_input = get_str(atoi(lines_input.c_str()));
}
unsigned result() {
return count_target();
}
private:
string lines_input = "", str_target = "", animal_input = "";
unsigned str_len = 0,an_count = 0;

string get_str(int times_i = 0) {
string str_lines = "";
if (times_i == 0) {
return str_lines;
} else {
getline(cin, str_lines);
return str_lines + get_str(times_i - 1);
}
}

unsigned int count_target() {
str_len = animal_input.length();
for (int i=0;i<str_len;i++) {
int s_index = animal_input.find(str_target);
if (s_index != -1) {
an_count++;
animal_input = animal_input.substr(s_index + str_target.length(), str_len);
} else {
break;
}
}
return an_count;
}

};

int main() {
Homework m;
m.input_times();
m.input_animal();
m.input_description();
cout << m.result() << endl;
return 0;
}

运行截图

6月

X1

题目A(C语言8.5)

题目描述

1
2
有两个数组a和b,各有10个元素,将它们对应的逐个比较(即a[0]与b[0]比,a[1]与b[1]比,余此类推)。如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如a[i]>b[i]6次,而b[i]>a[i]3次),则判定a数组大于b数组。
请写一个程序判断a数组和b数组的大小关系,并统计出两个数组对应元素大于、等于、小于的次数。

输入

1
有两行,每一行有10个用空格隔开的整数,表示a数组和b数组。

输出

1
2
3
首先在第一行内输出a数组中元素与b数组中对应元素的大于、等于、小于的次数,用空格隔开。
若a数组大于b数组,则在第二行中输出“a>b”;若a数组小于b数组,则输出“a<b”;若两个数组相等,则输出“a=b”。
请注意不需要输出引号,并请注意行尾输出换行。

样例输入

1
2
1 3 5 7 9 8 6 4 2 0
5 3 8 9 -1 -3 5 6 0 4

样例输出

1
2
4 1 5
a<b

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>

using namespace std;

int main() {
int a[10], b[10];
int result[3];
for (int i=0;i<3;i++) {
result[i] = 0;
}

for (int i=0;i<10;i++) {
cin >> a[i];
}

for (int i=0;i<10;i++) {
cin >> b[i];
}

for (int i=0;i<10;i++) {
if (a[i] > b[i]) {
result[0]++;
} else if (a[i] == b[i]) {
result[1]++;
} else if (a[i] < b[i]) {
result[2]++;
}
}

for (int i=0;i<3;i++) {
cout << result[i];
if (i != 2) cout << " ";
}
cout << endl;
if (result[0] > result[2]) {
cout << "a>b\n";
} else if (result[0] < result[2]) {
cout << "a<b\n";
} else {
cout << "a=b\n";
}
return 0;
}

题目B(C语言10.28)

题目描述

1
2
3
4
5
6
7
有一个班有4个学生,5门课程。分别完成三个函数,实现以下三个要求:

1、 求第一门课程的平均分;

2、 找出有2门(含2门)以上课程不及格(成绩小于60分)的学生,输出他们的学号和全部课程成绩及平均成绩;

3、 找出平均成绩在90分(含90分)以上或全部课程成绩在85分(含85分)以上的学生。

输入

1
共有4行,每行有6个用空格隔开的整数,第一个整数表示学生的学号,之后的5个整数表示这个学生所有5门课程的成绩。输入保证所有学号不包含前导0,所有成绩都在0至100之间(包含0和100)。

输出

1
2
3
4
第一行输出第一门课程的平均分,保留2位小数。
对于每一个有2门(含2门)以上课程不及格的学生,在一行内输出其学号、5门课程的成绩以及平均成绩,用空格隔开。请注意,平均成绩保留2位小数,且之后不需要输出空格。如果有多个满足条件的学生,按照输入顺序依次输出。
最后一行输出所有满足第3条要求的学生的学号,每个学号后输出一个空格。如果有多个满足条件的学生,按照输入顺序依次输出。
请注意行尾输出换行。

样例输入

1
2
3
4
20120003 85 86 85 89 89
20120001 75 59 55 90 88
20120015 65 55 60 85 80
20120009 80 95 95 90 90

样例输出

1
2
3
76.25
20120001 75 59 55 90 88 73.40
20120003 20120009

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
int course[4][5];
long long stu_id[4];
int stu_id_low[4];
long long stu_id_high[4];
for (int i=0;i<4;i++) {
cin >> stu_id[i];
for (int ii=0;ii<5;ii++) {
cin >> course[i][ii];
if (course[i][ii] < 0 || course[i][ii] > 100) course[i][ii] = 0;
}
}
int avg_c1 = 0;
for (int i=0;i<4;i++) {
avg_c1 += course[i][0];
}
cout << setiosflags(ios::fixed) \
<< setprecision(2) << (double)avg_c1/4 << endl;

int index_ = 0, index1_ = 0;
for (int i=0;i<4;i++) {
int grade_count = 0, grade_count1 = 0;
double avg_grade = 0;
for (int ii=0;ii<5;ii++) {
int * const num_g = &course[i][ii];
if (*num_g < 60) {
grade_count++;
}
if (*num_g >= 85) {
grade_count1++;
}
avg_grade += *num_g;
}
avg_grade = avg_grade / 5;
if (grade_count >= 2) {
stu_id_low[index_] = i;
index_++;
}
if (grade_count1 == 5 || avg_grade >= 90) {
stu_id_high[index1_] = stu_id[i];
index1_++;
}
}
for (int i=0;i<index_;i++) {
cout << stu_id[stu_id_low[i]];
avg_c1 = 0;
for (int ii=0;ii<5;ii++) {
cout << " " << course[stu_id_low[i]][ii];
avg_c1 += course[stu_id_low[i]][ii];
}
cout << " " << setiosflags(ios::fixed) \
<< setprecision(2) << (double)avg_c1/5 << endl;
}
for (int i=0;i<index1_;i++) {
cout << stu_id_high[i];
if (i != (index1_-1)) cout << " ";
}
cout << "\n";
return 0;
}

题目C(杀毒)

题目描述

1
2
天勤论坛中毒了……为了杀毒,我们必须删除源代码里面的某些字符。
即从第一字符串中删除第二个字符串中所有的字符。

输入

1
2
输入有多组数据。
每组数据两行,每行一个字符串(只包含大小写字母,长度<=2^18)。从第一字符串中删除第二个字符串中所有的字符。

输出

1
对应每组数据,输出改变后的第一个字符串.

样例输入

1
2
3
4
TheyAreStudents
aeiou
ACMclub
Cb

样例输出

1
2
ThyArStdnts
AMclu

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <string>

using namespace std;

int main() {
string line[2];
while (1) {
getline(cin, line[0]);
if (line[0] == "") break;
getline(cin, line[1]);

for (auto s_char : line[0]) {
int length_s = line[1].length();
const char *ptr = line[1].c_str();
for (int i=0;i<length_s;i++) {
if (isupper(s_char) || islower(s_char)) {
if (s_char != *(ptr + i)) {
if (i == (length_s-1)) {
cout << s_char;
}
} else {
break;
}
}
}
}
cout << endl;
}

return 0;
}

题目D(改写整数)

题目描述

1
2
3
4
5
小红又给小明出难题了,这次的问题是给小明一些非负整数,让他按照一定的规则编程改写这些整数,规则如下:
如果某个正整数中有n个相同的数字x连续出现,那么将它们改写成“nx”的形式;
对于单独出现的数字x,将其改写成“1x”的形式。
例如,122344111应该改写为1122132431。
由于小明的编码能力太弱,所以请你帮他编程解决这个问题。

输入

1
2
输入的第一行是一个正整数n(n<=1000),表示测试数据的组数。
接下来n行,每行输入一个要改写的非负整数,每个整数的位数不超过1000。

输出

1
对于每组输入,输出改写后的形式。

样例输入

1
2
3
4
3
122344111
1111111111
12345

样例输出

1
2
3
1122132431
101
1112131415

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <string>

using namespace std;

void count_num(string input) {
unsigned int aa = 0;
const char *ptr = input.c_str();
while (aa < input.length()) {
char char_a = *(ptr+aa);
unsigned int num_count = 0;
for (auto char_aa : input.substr(aa, input.length())) {
if (char_a == char_aa) {
num_count++;
} else {
break;
}
}
if (num_count >= 1) {
cout << num_count << char_a;
aa += (num_count-1);
}
aa++;
}
cout << endl;
}

int main() {
string num = "";
getline(cin, num);

int count = atoi(num.c_str());
for (int i=0;i<count;i++) {
string string_in = "";
getline(cin, string_in);
count_num(string_in);
}

return 0;
}

X2

题目A(判断三角形形状)

题目描述

1
2
3
给你三角形的三条边,你能告诉我它是哪种三角形吗?
如果是直角三角形,请输出“good”。如果是等腰三角形,请输出“perfect”。否则,请输出“just a triangle”。
题目保证输入数据合法。

输入

1
2
输入的第一行为一个整数t,表示测试样例的数量。
每组样例包含了三个整数a,b,c,代表了三角形的三条边的长度。(0<a,b,c<300)

输出

1
对于每组样例,输出结果,每组结果占一行。

样例输入

1
2
3
4
5
4
3 4 5
2 2 3
1 4 4
4 6 3

样例输出

1
2
3
4
good
perfect
perfect
just a triangle

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>


using namespace std;

bool check_perfect(unsigned int a,unsigned int b,unsigned int c) {
if (a == b || b == c || a == c) {
cout << "perfect" << endl;
return true;
} else {
return false;
}
}
bool check_good(unsigned int a,unsigned int b,unsigned int c) {
if (a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a) {
cout << "good" << endl;
return true;
} else {
return false;
}
}

int main() {
int num, a1, a2, a3;
cin >> num;
for (int i=0;i<num;i++) {
cin >> a1 >> a2 >> a3;
if (check_good(a1, a2, a3)) {
} else if (check_perfect(a1, a2, a3)) {
} else {
cout << "just a triangle" << endl;
}
}

return 0;
}

题目B(C语言6.16)

题目描述

1
一个数如果恰好等于它的因子之和,这个数就被称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。找出1000之内的所有完数,并输出。

输入

1

输出

1
2
每一个完数一行。在每一行中,首先输出这个完数的值,再输出一个冒号,之后从小到大输出这个完数的所有因子,在每个因子前输出一个空格。
请注意行尾输出换行。

样例输入 Copy

1

样例输出 Copy

1
2
3
6: 1 2 3
28: 1 2 4 7 14
496: 1 2 4 8 16 31 62 124 248

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <string>

using namespace std;


void paixu(unsigned int *aa, unsigned int leng = 0) {
for (int i=leng-1;i>=0;i--) {
for (int ii=i;ii>=0;ii--) {
if (*(aa+ii) > *(aa+i)) {
swap(*(aa+ii), *(aa+i));
}
}
}
}

bool check(unsigned int num, unsigned int *num_ch, unsigned int &lengt) {
unsigned int cum = 1, iindex = 0, a, b;


for (a=2;a<=num;a++) {
for (b=a;b<=num;b++) {
if (a*b == num) {
cum += a;
cum += b;
*(num_ch+iindex) = a;
*(num_ch+iindex+1) = b;
iindex += 2;
//cout << iindex << "<> ";
//cout << a << " " << b << " " << num << endl;
break;
}
}
}
lengt = iindex;
if (cum == num) return true;
else return false;
}

int main() {
for (int i=2;i<=1000;i++) {
unsigned int ch_num[20000], length = 0;
if (check(i, ch_num, length)) {
cout << i << ": 1 ";
paixu(ch_num, length);
for (int i=0;i<length;i++) {
cout << ch_num[i];
if (i != (length-1)) cout << " ";
}
cout << endl;
}
}


return 0;
}

题目C(水仙花数)

题目描述

1
2
3
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。

输入

1
两个整数m和n(100<=m<=n<=999)。

输出

1
2
要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no。

样例输入

1
300 380

样例输出

1
370 371

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cmath>

using namespace std;


int main() {
unsigned int m, n, index = 0;
cin >> m >> n;
if (m >= 100 && n <= 999 && m <= n) {
for (int i=m;i<n;i++) {
if (pow(i/100%10,3) + pow(i/10%10,3) + pow(i%10,3) == i) {
if (index != 0) cout << " ";
cout << i;
index++;
}
}
if (index == 0) cout << "no";
cout << endl;
}

return 0;
}

题目D(数列3)

题目描述

1
小明有天在做数学题,碰到这样一个问题,只告诉你一个数列的前三个数,并且这个数列一定是等差数列或等比数列中的一种,问你这个数列的第k个数是什么。现在请你编程帮小明解答这个问题。

输入

1
2
3
输入的第一行是一个整数n,表示共有n组数列。
接下来n行,每行输入四个整数,前三个数表示数列的前三个数,第四个数就是题目描述中的k。
其中0<k<=10^9,其他三个数的范围为[0,2^63)。题目保证输入的数列为非降序的。

输出

1
对于每组数列,输出数列中的第k个数模(%)200907后的结果。

样例输入

1
2
3
2
1 2 3 5
1 2 4 5

样例输出

1
2
5
16

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>


using namespace std;



int main() {
unsigned int num;
cin >> num;
while (num-- > 0) {
long long a1[4] = {0,0,0,0}, mt = 0, result = 0;
int is_ = 0;

cin >> a1[0] >> a1[1] >> a1[2] >> a1[3];
//for (int ii=0;ii<4;ii++) {
//cin >> a1[ii];
//}

if (!(a1[3] > 0)) break;
if (!(a1[0] >= 0)) break;

result = a1[0];

if (a1[1]-a1[0] == a1[2]-a1[1]) {
is_ = 1;
mt = a1[2] - a1[1];
} else if (a1[1] / a1[0] == a1[2] / a1[1]) {
is_ = 2;
mt = a1[2] / a1[1];
}
mt = mt %200907;

long long aa = a1[3] - 1;
if (is_ == 1) {
/*while (aa > 0) {
if(aa &1) result = (result+mt)%200907;
aa /= 2;
mt = (mt*2)%200907;
}*/
result += mt*(a1[3]-1);
result %= 200907;
} else if (is_ == 2) {
while (aa > 0) {
if(aa &1) result = (result*mt)%200907;
aa /= 2;
mt = (mt*mt)%200907;
}
}


if (is_ != 0) cout << result << endl;

}
return 0;
}

解释

此题需要使用快速幂算法计算

否则将耗费大量时间导致超时

快速幂算法参考

结束

EOF