第一次首A(喜)
2024-07-06 10:24:48
发布于:江苏
22阅读
0回复
0点赞
首先,你仔细读题了吗 请仔细读题。
题目要求是可以出现2 * 3 = 6 的情况的,这是个小坑 起码我被坑到了
这就迫使我们不能使用两个数组分别存2的i次方和3的j次方
错误写法:
#include<bits/stdc++.h>
using namespace std;
int a[10005], b[10005];
int main() {
int n;
cin >> n;
for(int i = 1; pow(2, i) <= n * 2; i ++) a[i] = pow(2, i);
for(int i = 1; pow(3, i) <= n * 2; i ++) b[i] = pow(3, i);
for(int i = 1, j = 1; a[i] <= n && b[j] <= n; ){
if(a[i] <= b[j]){
cout << a[i];
i ++;
}
else{
cout << b[j];
j ++;
}
}
return 0;
}
正确的思路是这样的:
定义一个find函数(简称fd):
fd函数用于找出所有从1到n的AC数,并返回一个包含这些数的vector。
在循环中,对每个数 i 进行检查:
通过while循环去除 i 中所有的2和3。如果剩下的数为1,则 i 是AC数。
将AC数添加到 numbers向量中。
vector<int> fd(int n) {
vector<int> numbers;
for (int i = 1; i <= n; ++i) {
int num = i;
while (num % 2 == 0) num /= 2;
while (num % 3 == 0) num /= 3;
if (num == 1) numbers.push_back(i);
}
return numbers;
}
接着来看主函数:
在 main 函数中,首先读取输入的整数n。
调用 findACNumbers 函数来获取所有的AC数。
输出所有的AC数,用空格隔开。
int n;
cin >> n;
vector<int> result = fd(n);
for (int i = 1; i < result.size(); ++i) {
cout << result[i];
if (i != result.size() - 1) {
cout << " ";
}
}
cout << endl;
return 0; //好习惯
最后,结合起来,加上头文件:
#include<bits/stdc++.h>
using namespace std;
vector<int> fd(int n) {
vector<int> numbers;
for (int i = 1; i <= n; ++i) {
int num = i;
while (num % 2 == 0) num /= 2;
while (num % 3 == 0) num /= 3;
if (num == 1) numbers.push_back(i);
}
return numbers;
}
int main() {
int n;
cin >> n;
vector<int> result = fd(n);
for (int i = 1; i < result.size(); ++i) {
cout << result[i];
if (i != result.size() - 1) {
cout << " ";
}
}
cout << endl;
return 0;
}
这里空空如也
有帮助,赞一个