输入为 n ,这是一个整数
输出由空格分隔的系列组成
样本输入:
6
样本输出:
34 18 10 6 4 3
对于这个程序,我最初声明了两个变量,并分别将它们初始化为34和18。从那以后很容易计算下一个值并继续打印它们。但这是假设系列仅从34开始,而系列只包含6个术语。此输出未被接受,因为它可能未满足所有测试用例。 所以我编写了以下程序,根据用户输入的 n 的值找出系列,而程序将找出系列的起始位置并从那里开始计算系列。
#include <stdio.h>
int main()
{
int a=34,b=18,n,i,sub=16;
scanf("%d",&n);
if(n>6)
{
for(i=0;i<n-6;i++)
{
sub=sub*2;
a=a+sub;
b=b+(sub/2);
}
}
printf("%d %d",a,b);
for(i=0;i<n-2;i++)
{
sub=sub/2;
b=b-sub;
printf(" %d",b);
}
return 0;
}
这样我计算系列的第一个词是什么,然后从那里开始模式。但它仍未被接受。这段代码是否有某些方法不能满足测试用例或是否应该进行改进?
答案 0 :(得分:1)
我建议使用std::generate
示例:
int main()
{
std::size_t const N = 6;
std::vector<int> v(N);
auto start = 0;
std::cin >> start;
std::generate(v.begin(), v.end(), [x = start * 2 - 1]() mutable {
return x = (x / 2 + 1);
});
for (auto const& i : v) std::cout << i << ' ';
}
答案 1 :(得分:0)
这是相当古老的,但如果有人偶然发现它有一天:
在代码中有一些错误或可能更好的小事情:
1 - 不要假设用户不会输入大于6的数字并以任何一种方式运行代码,即使结果是abcde 0 0 0 ...(如果您的代码更为重要将被提交到一台机器,因为机器将尝试更多的可能性来破坏您的代码)
2 - 如果您要初始化a和b(两个第一个数字),您必须在代码中包含用户只想要这两个数字的可能性。
3 - 正如您已经初始化前两个数字一样,不要在i=0
开始循环
4 - 可能会有更多的事情要指出,但主要是,如前所述:
该系列中的模式是T(n + 1)= T(n)/ 2 + 1。你的代码可以 简化了很多。
这是一个更简单的代码版本(总是有更好的代码,但这些代码在各个层面都很容易理解):
使用while
循环:
#include <stdio.h>
int main() {
int n, a = 34, i = 2;
scanf("%d", & n);
if (n == 1)
printf("%d", a);
else {
printf("%d ", a);
while (i <= n) {
a = (a / 2) + 1;
printf("%d ", a);
i++;
}
}
return 0;
}
使用for
循环
#include <stdio.h>
int main() {
int n, a = 34, i;
scanf("%d", & n);
if (n == 1)
printf("%d", a);
else {
printf("%d ", a);
for (i = 2; i <= n; i++) {
a = (a / 2) + 1;
printf("%d ", a);
}
}
return 0;
}
我希望这有帮助!
答案 2 :(得分:0)
我认为问题陈述仍然缺少一些约束。
你需要像 34 这样的起始号码和条款的边数,即6个用户。
或者您应该提供更多示例来支持起始编号等于num*num - 2
这一事实。
此外,您可以在一定程度上缩短代码长度。
#include <stdio.h>
int main(void) {
int noOfTerms = 6, number=34;
for(int i=0;i<noOfTerms;i++){
printf("%d ",number);
number = number - (number/2) + 1;
}
return 0;
}
Output:
34 18 10 6 4 3