其他数字的积
思路一:模拟
直接分类计算就好了,统计一下零的个数cnt,如果cnt>2就全为0,cnt=1就只有为零的那个数字哪里不输出0,cnt=0就正常计算。
include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int SIZE = 1e4+5;
int nums[SIZE];
ull sum;
ull cnt;
int main() {
ull N;
cin >> N;
for (int i = 1; i <= N; ++i) {
cin >> nums[i];
if (nums[i]) {
if (!sum)
sum = nums[i];
else {
sum *= nums[i];
}
} else {
cnt++;
}
}
for (int i = 1; i <= N; ++i) {
if (cnt == 0) {
printf("%llu ", sum / nums[i]);
} else if (cnt == 1) {
if (nums[i]) {
printf("0 ");
} else {
printf("%llu ", sum);
}
} else {
printf("0 ");
}
}
}
思路二:前缀积与后缀积
此题目的输出因为i前面那些元素的乘积和i后面那些元素的乘积相乘。只需要记录前缀积和后缀积然后相乘即可,然而此思路效率更低了,除了无需处理0外无任何优势,仅记录:
include
using namespace std;
typedef unsigned long long llu;
llu nums[10005];
llu pre[10005];
llu suf[10005];
int main() {
llu N;
cin >> N;
pre[0] = 1;
for (llu i = 1; i <= N; ++i) {
cin >> nums[i];
pre[i] = pre[i - 1] * nums[i];
}
suf[N + 1] = 1;
for (llu i = N; i > 0; --i) {
suf[i] = suf[i + 1] * nums[i];
}
for (llu i = 1; i <= N; ++i) {
printf("%llu ", pre[i - 1]*suf[i + 1]);
}
}
浙公网安备 33010602011771号