给定一个整数 ,生成第一个 Aronson序列的术语。
Aronson的序列是从句子中T(或t)的索引获得的整数的无穷序列:
“T is the first, fourth, eleventh, sixteenth, … letter in this sentence.”
- 句子中T的第一个出现在索引1 (基于1的索引)上,第一个提到的数字是第一个即1
- 类似地,句子中t的第二次出现是在索引4处,提到的第二个数字是第四次,即4
- 类似地,句子中t的第三次出现在索引11处,而提到的第三次出现的数字是第十一位,即11
- 同样,系列继续显示为1,4,11,16,…
例子:
Input: n = 3
Output: 1, 4, 11
Input: n = 6
Output: 1, 4, 11, 16, 24, 29
方法:一个简单的想法是存储字符串“ 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,