这题在我看来有点乱,还有好多种情况没有覆盖,然后实际求的好像也与题目描述的有点偏差,都不知道怎么写题解了
C:(100分)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>]
#define Max 110
int main()
{
int n = 0; //用于储存题目中 n 的值
int finally_answer = 0; //用于储存 最后输出的答案
int arr1[Max];
int arr2[Max];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
arr2[i] = arr1[i];
}
for (int i = 0; i < n - 1; i++) //用于获得 “左值”,即题目样例 1+2=3 中的 1
{
for (int j = i + 1; j < n; j++) //用于获得 “右值”,即题目样例 1+2=3 中的 2
{
for (int k = 0; k < n; k++) //用于遍历整个 数组arr2,以此来判断 数组arr2 内是否有等于 “得数” 的数
{
if (arr1[i] + arr1[j] == arr2[k]) //“左值” + “右值“ = “得数”
{
arr2[k] = 0; //把 数组arr2 中 等于“得数”的数 变成0,因为题目是要求“正整数”,变成0后 哪怕下次循环 上两行求出的“得数” 与这次一样,上两行的if判断也不会通过
finally_answer++; //让最后输出的数自增
}
}
}
}
printf("%d", finally_answer);
return 0;
}
C++:(100分)
相较于C的话,C++我的想法是采用set容器
一来是不用遍历直接查找内容,二来是可以删除元素。
相较于C中把 数组arr2中元素 变成0的做法,每删除一个容器中的元素就可以在查找的时候少遍历一次。
但理想很美好,现实很骨感。为什么两个用时一样啊喂
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <set>
using namespace std;
#define Max 110
int main()
{
int n = 0;
int finally_answer = 0;
int c = 0;
int arr1[Max];
set<int> arr2;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
arr2.insert(arr1[i]);
}
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
//创建一个 迭代器it ,用于接收函数的返回值
set<int>::iterator pos = arr2.find(arr1[i] + arr1[j]); //arr2.find() - set容器的查找函数,用于查找指定元素。
//如果查找到了,就 返回 查找到的元素在这个容器中 的迭代器
//如果没有找到,就 返回一个指向 最后一个元素下一个位置 的迭代器)
if (pos != arr2.end())
{
arr2.erase(pos);
finally_answer++;
}
}
}
printf("%d", finally_answer);
return 0;
}
python: (100分)
python的话我的想法也是和C++一样采用容器的方法
但python方面我学得很浅,稍微看了下几个容器的介绍,发现set容器有个比较有趣的方法是求交集,就来搞搞看吧
总代码:
input("")
a = set(map(int, input().split(" ")))
b = set()
for i in a:
for j in a:
if i != j:
b.add(i + j)
print(len(b.intersection(a)))
解析:
input("") # 把第一行的输入干掉,第一行的输入没什么用
a = set(map(int, input().split(" ")))
'''
这一行代码可以细分为 5 步,运行顺序由里到外
1. input() - 接受输入的内容,并返回 处理过的 输入的内容
这里由于python会自动识别输入内容的缘故,输入的 1 2 3 4 会被自动识别为 字符串(str)"1 2 3 4" (空格也算在字符串内)
最后返回 字符串(str)"1 2 3 4"
2. input().split(" ")
split(" ") 本来是用于字符串分割的 即str.split(" ")
由于之前 input()返回了 一个 字符串(str)"1 2 3 4"
那么现在是: "1 2 3 4".split(" ")
str.split(" ")
split是一个类内函数,split() 的 () 内填写的是分割的参数,这个参数要是 字符串(例:"@#") 或者 字符(例:‘@’) (由于python里面双引号" 和 单引号' 不像 C或C++ 那样严格,有时我会混用)
然后就会根据这个字符串进行分割,并最后返回一个分割完成的列表,例:
分割前(是字符串) 分割后(变成列表了)
"1 2 3 4".split(" ") -> "1 2 3 4" -> ['1', '2', '3', '4']
"d@*f#@*%*".split("@*") -> "d@*f#@*%*" -> ['d', 'f#', '%*']
3. map(int, input().split(" "))
由 步骤2 知道了 input().split(" ") 会返回一个列表
所以 map(int, input().split(" ")) 可以看成 map(int, 某列表)
map() - 把一个函数func依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果
讲人话:
以这个 map(int, 某列表) 为例,就是对 某列表 内的每一个元素 都执行 int操作(这里的int是指 数据强制装换成int类型, 根据需求也可以换其他类型)
map(int, 某列表) 的 int 的位置可以变成 其他(已定义的)函数,就相当于 对 某列表 内的每一个元素 都执行 其他函数 的操作
例:
map(int, ['1', '2', '3', '4'])
['1', '2', '3', '4'] (原来这个列表每一个元素都是char类型的) ————————————————————————————————————> ['1', '2', '3', '4'] (这个列表每一个元素都变成int类型了)
map(某个使传入的参数自增的函数(), ['1', '2', '3', '4'])
['1', '2', '3', '4'](元素都是int类型) ——————————————————————————————————————————————————————————> ['2', '3', '4', '5'](这个列表每一个元素都自增了)
最后说一下map的返回:
在python3中 map 是返回一个 迭代器(指针)的, 这个 迭代器(指针) 指向 被处理完成后的 内容 的地址
在其他版本中 map 好像是返回 list 的
4. set(map(int, input().split(" ")))
由 3 知道 map(int, input().split(" ")) 返回的是一个迭代器
而这里的set()不是函数,而是强制转换(类似于int())
作用是将迭代器指向的目标强制转换成 map
在这里 是将原来的 列表 变成一个 元素相同的set容器 (地址变没变不清楚)
5. a = set()
a - 变量名
把 强制转换得到的内容 储存到 a
'''
b = set() # 创建一个 set容器 ,但里面没有元素
for i in a: # 遍历 a中的每一个元素并赋值给 i
for j in a: # 遍历 a中的每一个元素并赋值给 j
if i != j:
b.add(i + j) # 往 set容器b 中 添加 i + j 算术的结果(int类型)
print(len(b.intersection(a)))
'''
这一行代码可以细分为 3 步,运行顺序由里到外
1. b.intersection(a)
返回 b 与 a 的交集,这个交集也是 set容器
还有其他用法,自己百度
2. len(b.intersection(a))
由 1 得到 b.intersection(a) 返回的是一个 set容器
len(b.intersection(a)) 可以看成 len(某容器)
在这里len(某容器)是返回 某容器 的 元素个数 (也有用来返回对象长度的其他用法)
返回的 元素个数为 int类型
3. print()
。。。。。。就打印
'''