题目描述
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。
输入格式
集合中的元素(元素<=1000)
输出格式
和
这道题的计算方式就是每个元素一共会出现2的(n-1)次方次(n是集合中所含元素个数),所以我们只需将所有元素相加乘以2的(n-1)次方即可得到答案。
这道集合求和的题目的代码内容编写难度并不大,但在我编写的过程中,发现一开始无法中止集合元素的输入。(例如题目所给的输入案例是2 3,但在我输入完按回车之后,显示框还在提醒我继续输入,无法直接给我我所需要的答案)
为了解决输入的问题,我在循环输入语句添加了判断条件,用getchar()去接收回车,如果判断为换行符则跳出循环,这样就能够解决输入的问题了。
while (cin >> a) {
ret += a;
i++;
if (getchar() == 10)
break;
}
还有一个问题就是,回车的ASCII码值是13,换行的ASCII码值是10,经过实验发现这里的判断条件应该使用10而不是13;通过搜索可以发现回车和换行的区别。
"回车",告诉打字机把打印头定位在左边界;
"换行" ( 打字机分两步完成 ),告诉打字机把纸向下移一行。
因为在此处我们主要需要的是进行换行操作,所有因使用10。(此处是我个人的理解,如有错误,还望指正)
以下便是完整代码:
#include<iostream>
using namespace std;
#include<math.h>
int main() {
cout.setf(ios::fixed, ios::floatfield);
cout.precision(0);
int a, i=0;
char ch;
long long ret = 0;
while (cin >> a) {
ret += a;
i++;
if (getchar() == 10)
break;
}
cout << fixed<<ret*pow(2, i-1);
system("pause");
return 0;
}