This is a sample C++ program that computes configurable length random "nicknames" and selects those nicknames that verifies "Armtrong property".
Armtrong property:
Given the number x1x2x3... it verifies Armtrong if : x1x2x3... = x1^3 + x2^3 + x3^3...
An example is the number 153 = 1^3 + 5^3 + 3^3
However!! this program works with a different criteria: which is x1x2x3...= x1*3+x2*3+x3*3....
For the iterations and nickname lengths specified in the code bellow, we get this result:
Note: Works fine with Codeblocks and gcc.
armtrongnames.cpp
/*
* armtrongnames.cpp
*
* Created on: 12 Dec 2018
* Author: david
*/
/*
* This is an example of Armtrong numbers applied to person names generation:
* Thus, we will map letters to numbers as a=1, b=2,...z=25
* Then we will get vocals: a,e,i,o,u
* Next we will generate names: cvcvcv(c) and vcvcvc(v), in the same time we will check if the number mapping is an Armtrong number
* Finally we will keep the Armtrong names: What this will give us?
Armstrong number (modified): x1x2...xn = x1*3+x2*3+...+xn*3
*/
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int isVocal(int pos,vector vocalsW) {
int r = -1;
for(int i=0;i vocalsW,string letters){
int r = -1;
if(pos>0 && pos<=letters.length()){
r =isVocal(pos,vocalsW);
if(r==0)
r=-1;
else
r = 0;
}
return r;
}
char getLetter(int pos,string letters){
char c = '*';
if(pos>0 && pos<=letters.length())
c = letters.at(pos-1);
return c;
}
int getRandVocalPos(vector vocalsW){
int pos = 0;
pos = rand() % 5;
return vocalsW[pos];
}
int getRandConsPos(vector vocalsW,string letters){
int pos =-1;
bool end = false;
while(!end){
pos = (rand()% letters.length()) +1;
if(isConsonant(pos,vocalsW,letters)==0){
end = true;
}
}
return pos;
}
int compDec(vector v) {
int n = 0;
int i = v.size() - 1;
int pw = 0;
while(i>=0){
if(v[i] != 0 ){
n = n + (v[i] * (int)(pow(10,pw)));
pw++;
}
i--;
}
return n;
}
int compArmtrong(int s){
int a=0;
int i = 1;
int b = s;
int c=0;
while(b>1){
c = b % i;
b = (b-c)/i;
i = i * 10;
a = a + (c*3); /*a = a + (int) pow(c,3); */
}
return a;
}
int sumVect(vector v) {
int a=0;
for(int i=0;i v){
int r = -1;
int ams = -1;
int sum = sumVect(v);
ams = compArmtrong(sum);
if(ams==sum)
r = 0;
return r;
}
string buildName(vector v,string letters){
string name("");
char c;
for(int i=0;i::iterator iter;
std::string letters("abcdefghijklmnopqrstuwxyz");
vector vocalsW;
int MAXITER = 900;
int MAXNAMELEN = 20;
int MINNAMELEN = 4;
int T = MAXITER * ((MAXNAMELEN-MINNAMELEN) + 1);
std:vector *amsnames = new vector();
vocalsW.push_back(1);vocalsW.push_back(5);
vocalsW.push_back(9);vocalsW.push_back(15);
vocalsW.push_back(21);
int i = 0;
while(i0){
vector nameW;
if(altern%2==0){ //first a consonant
for(int k=1;k<=j;k++){
if(k%2!=0)
nameW.push_back( getRandConsPos(vocalsW,letters) );
else
nameW.push_back(getRandVocalPos(vocalsW));
}
}
else { //first a vocal
for(int k=1;k<=j;k++){
if(k%2!=0)
nameW.push_back( getRandVocalPos(vocalsW) );
else
nameW.push_back(getRandConsPos(vocalsW,letters));
}
}
int r = isArmtrong(nameW);
string name = buildName(nameW,letters);
cout << name << endl;
if(r==0)
amsnames->push_back(name);
altern--;
}
j++;
}
i++;
}
cout << "+++++++++++++++++++++++++" << endl;
cout<< "Generated Armtrong Names:" << amsnames->size() << endl;
int cnt = 1;
for(iter=amsnames->begin();iter!=amsnames->end();iter++){
cout<< cnt << " :" << *iter << endl;
cnt++;
}
getch();
return 0;
}
