PTA 外观数列(java)

本文详细解析了外观数列的生成算法,通过实例演示如何根据给定的起始数字和序列长度,推算出特定项的值。介绍了算法的具体实现过程,包括输入格式、输出格式以及样例解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1084 外观数列 (20分)

外观数列是指具有以下特点的整数序列:
d, d1, d111, d113, d11231, d112213111, …
它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d,所以就是 d1;第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就是 d111。又比如第 4 项是 d113,其描述就是 1 个 d,2 个 1,1 个 3,所以下一项就是 d11231。当然这个定义对 d = 1 也成立。本题要求你推算任意给定数字 d 的外观数列的第 N 项。

输入格式:

输入第一行给出 [0,9] 范围内的一个整数 d、以及一个正整数 N(≤ 40),用空格分隔。

输出格式:

在一行中给出数字 d 的外观数列的第 N 项。

输入样例:

1 8

输出样例:

1123123111

样例解答:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
 public static void main(String[] args) throws IOException {
  BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
  String[] str = bf.readLine().split(" ");
  String s = str[0];
  int n = Integer.parseInt(str[1]);
  for(int i=1;i<n;i++) {
   StringBuilder s1 = new StringBuilder();
   for(int j=0;j<s.length();){
    int index=j;
    while(index<s.length()&&s.charAt(index)==s.charAt(j)) {
     index++;
    }
    s1.append(s.charAt(j)).append(index-j);
    j=index;
   }
   //System.out.println(s1);
   s=s1.toString();
  }
  System.out.println(s);
 }
}
### 使用C语言编写斐波那契数列程序 为了实现斐波那契数列,在C语言中有多种方法可以完成这一任务。下面展示一种基于迭代的方式,这种方式相较于简单的递归效率更高。 #### 方法一:通过循环计算斐波那契数列并打印特定项 ```c #include <stdio.h> int fibonacci(int n) { if (n == 0) return 0; else if (n == 1) return 1; int a = 0, b = 1, c; for (int i = 2; i <= n; ++i) { c = a + b; a = b; b = c; } return b; } int main() { int n; scanf("%d", &n); printf("Fibonacci(%d) = %d\n", n, fibonacci(n)); return 0; } ``` 此代码段实现了给定索引`n`处的斐波那契数值的获取[^1]。对于较大的`n`值来说,这种方法比直接采用递归来得更高效,因为它避免了大量的重复计算。 #### 方法二:计算斐波那契数列前N项之和 如果目标是求解斐波那契数列中前若干项的总和,则可按照如下方式进行: ```c #include <stdio.h> int main() { int n, sum = 0, t1 = 0, t2 = 1, nextTerm = 0; printf("Enter the number of terms: "); scanf("%d", &n); for (int i = 1; i <= n; ++i) { // 打印每一项 printf("%d ", t1); sum += t1; // 计算下一项 nextTerm = t1 + t2; t1 = t2; t2 = nextTerm; } printf("\nThe sum is %d.\n", sum); return 0; } ``` 上述代码不仅能够输出斐波那契序列中的每一个成员直到第`n`个位置,而且还会累加这些数字得到它们的总和[^2]。 #### 方法三:找出指定范围内的所有斐波那契数 当需要找到位于两个整数之间的所有斐波那契数时,可以通过不断生成新的斐波那契数并与边界比较来达成目的: ```c void PrintFN(int m, int n) { int i = 1; int flag = 1; // 控制是否为首项输出标志位 int count = 0; // 统计符合条件的数量 while (fib(i) < m) { i++; } while (fib(i) <= n) { if (flag) { printf("%d", fib(i)); flag = 0; } else { printf(" %d", fib(i)); } count++; i++; } if (!count) { printf("No Fibonacci number"); } } ``` 这里假设已经定义了一个名为`fib()`的辅助函数用于返回对应序号下的斐波那契数值[^4]。这段逻辑会遍历可能存在的斐波那契数直至超出上限为止,并适当调整输出格式以满足题目要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值