📜  阿龙森的序列

📅  最后修改于: 2021-05-07 18:29:16             🧑  作者: Mango

给定一个整数n ,生成第一个n Aronson序列的术语。

Aronson的序列是从句子中T(或t)的索引获得的整数的无穷序列:

  • 句子中T的第一个出现在索引1 (基于1的索引)上,第一个提到的数字是第一个1
  • 类似地,句子中t的第二次出现是在索引4处,提到的第二数字是第四次,4
  • 类似地,句子中t的第三次出现在索引11处,而提到的第三次出现的数字是第十一位,11
  • 同样,系列继续显示为1,4,11,16,…

例子:

方法:一个简单的想法是存储字符串“ T is”以获取序列的前两个项。对于这些术语中的每一个,将其转换为序数形式的单词,然后追加到字符串,并计算下一个较高术语的值。对n-2次生成的每个后续较高项重复此过程,以生成Aronson序列的前n个项。
有关将数字转换为单词的信息,请参见此处。

下面是上述方法的实现:

C++
// C++ program to generate the
// first n terms of Aronson's sequence
  
#include 
using namespace std;
  
// Returns the given number in words
string convert_to_words(string num)
{
  
    // Get number of digits in given number
    int len = num.length();
  
    // Base cases
    if (len == 0 || len > 4) {
        return "";
    }
    /*
      The following arrays contain
      one digit(both cardinal and ordinal forms),
      two digit(<20, ordinal forms) numbers, 
      and multiples(ordinal forms) and powers of 10.
      
     */
    string single_digits_temp[]
        = { "", "one", "two", "three", "four"
              , "five", "six", "seven", "eight", "nine" };
    string single_digits[]
        = { "", "first", "second", "third", "fourth"
              , "fifth", "sixth", "seventh", "eighth", "ninth" };
  
    string two_digits[]
        = { "", "tenth", "eleventh", "twelfth", "thirteenth"
              , "fourteenth", "fifteenth", "sixteenth"
              , "seventeenth", "eighteenth", "nineteenth" };
  
    string tens_multiple[]
        = { "", "tenth", "twentieth", "thirtieth", "fortieth"
              , "fiftieth", "sixtieth", "seventieth"
              , "eightieth", "ninetieth" };
  
    string tens_power[] = { "hundred", "thousand" };
    string word = "";
  
    // If single digit number
    if (len == 1) {
        word += single_digits[num[0] - '0'];
        return word;
    }
    int i = 0, ctr = 0;
    string s = " ";
    while (i < len) {
  
        if (len >= 3) {
            if (num[i] != '0') {
                word
                    += single_digits_temp[num[i] - '0']
                       + " ";
  
                // here len can be 3 or 4
                word += tens_power[len - 3] + " ";
                ctr++;
            }
            len--;
            num.erase(0, 1);
        }
  
        // last two digits
        else {
            if (ctr != 0) {
                s = " and ";
                word.erase(word.length() - 1);
            }
  
            // Handle all powers of 10
            if (num[i + 1] == '0')
                if (num[i] == '0')
                    word = word + "th";
                else
                    word += s + tens_multiple[num[i] - '0'];
  
            // Handle two digit numbers < 20
            else if (num[i] == '1')
                word += s + two_digits[num[i + 1] - '0' + 1];
  
            else {
                if (num[i] != '0')
                    word
                        += s + tens_multiple[num[i] - '0']
                               .substr(0, tens_multiple[num[i] - '0']
                                  .length() - 4) + "y ";
                else
                    word += s;
                word += single_digits[num[i + 1] - '0'];
            }
            i += 2;
        }
        if (i == len) {
            if (word[0] == ' ')
                word.erase(0, 1);
        }
    }
    return word;
}
  
// Function to print the first n terms
// of Aronson's sequence
void Aronsons_sequence(int n)
{
    string str = "T is the ";
    int ind = 0;
    for (int i = 0; i < str.length(); i++) {
  
        // check if character
        // is alphabet or not
        if (isalpha(str[i])) {
            ind += 1;
        }
        if (str[i] == 't' or str[i] == 'T') {
            n -= 1;
  
            // convert number to words
            // in ordinal format and append
            str += convert_to_words(to_string(ind)) + ", ";
            cout << ind << ", ";
        }
        if (n == 0)
  
            break;
    }
}
  
// Driver code
int main(void)
{
    int n = 6;
    Aronsons_sequence(n);
    return 0;
}


Java
// Java program to generate the
// first n terms of Aronson's sequence
import java.util.*;
  
class GFG
{
  
// Returns the given number in words
static String convert_to_words(char[] num)
{
  
    // Get number of digits in given number
    int len = num.length;
  
    // Base cases
    if (len == 0 || len > 4) 
    {
        return "";
    }
      
    /*
    The following arrays contain
    one digit(both cardinal and ordinal forms),
    two digit(<20, ordinal forms) numbers, 
    and multiples(ordinal forms) and powers of 10.
      
    */
    String single_digits_temp[]
        = { "", "one", "two", "three", "four"
            , "five", "six", "seven", "eight", "nine" };
    String single_digits[]
        = { "", "first", "second", "third", "fourth"
            , "fifth", "sixth", "seventh", "eighth", "ninth" };
  
    String two_digits[]
        = { "", "tenth", "eleventh", "twelfth", "thirteenth"
            , "fourteenth", "fifteenth", "sixteenth"
            , "seventeenth", "eighteenth", "nineteenth" };
  
    String tens_multiple[]
        = { "", "tenth", "twentieth", "thirtieth", "fortieth"
            , "fiftieth", "sixtieth", "seventieth"
            , "eightieth", "ninetieth" };
  
    String tens_power[] = { "hundred", "thousand" };
    String word = "";
  
    // If single digit number
    if (len == 1)
    {
        word += single_digits[num[0] - '0'];
        return word;
    }
      
    int i = 0, ctr = 0;
    String s = " ";
    while (i < len)
    {
  
        if (len >= 3)
        {
            if (num[i] != '0')
            {
                word
                    += single_digits_temp[num[i] - '0']
                    + " ";
  
                // here len can be 3 or 4
                word += tens_power[len - 3] + " ";
                ctr++;
            }
            len--;
            num=Arrays.copyOfRange(num, 1, num.length);
        }
  
        // last two digits
        else
        {
            if (ctr != 0)
            {
                s = " and ";
                word = word.substring(0,word.length() - 1);
            }
  
            // Handle all powers of 10
            if (num[i + 1] == '0')
                if (num[i] == '0')
                    word = word + "th";
                else
                    word += s + tens_multiple[num[i] - '0'];
  
            // Handle two digit numbers < 20
            else if (num[i] == '1')
                word += s + two_digits[num[i + 1] - '0' + 1];
  
            else 
            {
                if (num[i] != '0')
                    word += s + tens_multiple[num[i] - '0']
                            .substring(0, tens_multiple[num[i] - '0']
                                .length() - 4) + "y ";
                else
                    word += s;
                word += single_digits[num[i + 1] - '0'];
            }
            i += 2;
        }
        if (i == len) 
        {
            if (word.charAt(0) == ' ')
                word = word.substring(1,word.length());
        }
    }
    return word;
}
  
// Function to print the first n terms
// of Aronson's sequence
static void Aronsons_sequence(int n)
{
    String str = "T is the ";
    int ind = 0;
    for (int i = 0; i < str.length(); i++) 
    {
  
        // check if character
        // is alphabet or not
        if (Character.isAlphabetic(str.charAt(i))) 
        {
            ind += 1;
        }
        if (str.charAt(i) == 't' || str.charAt(i) == 'T') 
        {
            n -= 1;
  
            // convert number to words
            // in ordinal format and append
            str += convert_to_words(String.valueOf(ind).toCharArray()) + ", ";
            System.out.print(ind+ ", ");
        }
        if (n == 0)
            break;
    }
}
  
// Driver code
public static void main(String[] args)
{
    int n = 6;
    Aronsons_sequence(n);
}
}
  
// This code is contributed by 29AjayKumar


C#
// C# program to generate the
// first n terms of Aronson's sequence
using System;
  
class GFG
{
  
// Returns the given number in words
static String convert_to_words(char[] num)
{
  
    // Get number of digits in given number
    int len = num.Length;
  
    // Base cases
    if (len == 0 || len > 4) 
    {
        return "";
    }
      
    /*
    The following arrays contain
    one digit(both cardinal and ordinal forms),
    two digit(<20, ordinal forms) numbers, 
    and multiples(ordinal forms) and powers of 10.
      
    */
    String []single_digits_temp
        = { "", "one", "two", "three", "four"
            , "five", "six", "seven", "eight", "nine" };
    String []single_digits
        = { "", "first", "second", "third", "fourth"
            , "fifth", "sixth", "seventh", "eighth", "ninth" };
  
    String []two_digits
        = { "", "tenth", "eleventh", "twelfth", "thirteenth"
            , "fourteenth", "fifteenth", "sixteenth"
            , "seventeenth", "eighteenth", "nineteenth" };
  
    String []tens_multiple
        = { "", "tenth", "twentieth", "thirtieth", "fortieth"
            , "fiftieth", "sixtieth", "seventieth"
            , "eightieth", "ninetieth" };
  
    String []tens_power = { "hundred", "thousand" };
    String word = "";
  
    // If single digit number
    if (len == 1)
    {
        word += single_digits[num[0] - '0'];
        return word;
    }
      
    int i = 0, ctr = 0;
    String s = " ";
    while (i < len)
    {
  
        if (len >= 3)
        {
            if (num[i] != '0')
            {
                word
                    += single_digits_temp[num[i] - '0']
                    + " ";
  
                // here len can be 3 or 4
                word += tens_power[len - 3] + " ";
                ctr++;
            }
            len--;
            Array.Copy(num, 1, num, 0, num.Length - 1);
        }
  
        // last two digits
        else
        {
            if (ctr != 0)
            {
                s = " and ";
                word = word.Substring(0,word.Length - 1);
            }
  
            // Handle all powers of 10
            if (num[i + 1] == '0')
                if (num[i] == '0')
                    word = word + "th";
                else
                    word += s + tens_multiple[num[i] - '0'];
  
            // Handle two digit numbers < 20
            else if (num[i] == '1')
                word += s + two_digits[num[i + 1] - '0' + 1];
  
            else
            {
                if (num[i] != '0')
                    word += s + tens_multiple[num[i] - '0']
                            .Substring(0, tens_multiple[num[i] - '0']
                                .Length - 4) + "y ";
                else
                    word += s;
                word += single_digits[num[i + 1] - '0'];
            }
            i += 2;
        }
        if (i == len) 
        {
            if (word[0] == ' ')
                word = word.Substring(1,word.Length - 1);
        }
    }
    return word;
}
  
// Function to print the first n terms
// of Aronson's sequence
static void Aronsons_sequence(int n)
{
    String str = "T is the ";
    int ind = 0;
    for (int i = 0; i < str.Length; i++) 
    {
  
        // check if character
        // is alphabet or not
        if (char.IsLetterOrDigit(str[i])) 
        {
            ind += 1;
        }
        if (str[i] == 't' || str[i] == 'T') 
        {
            n -= 1;
  
            // convert number to words
            // in ordinal format and append
            str += convert_to_words(String.Join("",ind).ToCharArray()) + ", ";
            Console.Write(ind + ", ");
        }
        if (n == 0)
            break;
    }
}
  
// Driver code
public static void Main(String[] args)
{
    int n = 6;
    Aronsons_sequence(n);
}
}
  
// This code is contributed by 29AjayKumar


输出:
1, 4, 11, 16, 24, 29,