编写一个程序来生成系列中的前n个术语--- 34,18,10,6,4,

时间:2016-07-03 05:57:04

标签: c loops

输入为 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;
}

这样我计算系列的第一个词是什么,然后从那里开始模式。但它仍未被接受。这段代码是否有某些方法不能满足测试用例或是否应该进行改进?

3 个答案:

答案 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 

Ideone