#include <iostream>
#include <string>
using namespace std;
#define ile_fib 3000
#define stringLength 1000
string addStringNumbers(string, string);
char addCharNumbers(char, char, bool &);
void removeLeadingZerosFromString(string &);
int main() {
string fib[ile_fib];
string searchedSubstring;
for(int i = 0; i < stringLength; i++)
fib[0] += "0";
for(int i = 0; i < stringLength - 1; i++)
fib[1] += "0";
fib[1] += "1";
// cout << fib[0] << endl << fib[1] << endl;
for(int i = 2; i < ile_fib; i++)
{
fib[i] = addStringNumbers(fib[i - 2], fib[i - 1]);
// cout << fib[i] << endl;
}
cin >> searchedSubstring;
// cout << searchedSubstring;
// removeLeadingZerosFromString(searchedSubstring);
// cout << searchedSubstring << endl;
int correctPosition = stringLength - searchedSubstring.length();
// cout << correctPosition << endl;
bool fibFound = false;
for(int i = 0; i < ile_fib; i++)
{
// cout << fib[i].rfind(searchedSubstring) << endl;
if (fib[i].rfind(searchedSubstring) == correctPosition)
{
cout << i << endl;
fibFound = true;
break;
}
}
if(!fibFound)
cout << "NIE";
return 0;
}
string addStringNumbers(string num1, string num2)
{
string sumString;
int longestString;
bool addOneInMemory = false;
char d1, d2;
num1.length() > num2.length() ? longestString = num1.length() : longestString = num2.length();
for(int i = 0; i < longestString; i++)
{
d1 = num1[longestString - i - 1];
d2 = num2[longestString - i - 1];
sumString = addCharNumbers(d1, d2, addOneInMemory) + sumString;
}
if(addOneInMemory)
sumString = "1" + sumString;
return sumString;
}
char addCharNumbers(char d1, char d2, bool &addOneInMemory)
{
int result = 0;
result = d1 - '0' + d2 - '0';
// cout << d1 << " " << d2 << " " << result << endl;
if(addOneInMemory)
result++;
if(result > 9)
{
result %= 10;
addOneInMemory = true;
}
else
addOneInMemory = false;
return result + '0';
}
void removeLeadingZerosFromString(string & searchedSubstring)
{
while(searchedSubstring[0] == '0')
searchedSubstring.erase(0,1);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <iostream> #include <string> using namespace std; #define ile_fib 3000 #define stringLength 1000 string addStringNumbers(string, string); char addCharNumbers(char, char, bool &); void removeLeadingZerosFromString(string &); int main() { string fib[ile_fib]; string searchedSubstring; for(int i = 0; i < stringLength; i++) fib[0] += "0"; for(int i = 0; i < stringLength - 1; i++) fib[1] += "0"; fib[1] += "1"; // cout << fib[0] << endl << fib[1] << endl; for(int i = 2; i < ile_fib; i++) { fib[i] = addStringNumbers(fib[i - 2], fib[i - 1]); // cout << fib[i] << endl; } cin >> searchedSubstring; // cout << searchedSubstring; // removeLeadingZerosFromString(searchedSubstring); // cout << searchedSubstring << endl; int correctPosition = stringLength - searchedSubstring.length(); // cout << correctPosition << endl; bool fibFound = false; for(int i = 0; i < ile_fib; i++) { // cout << fib[i].rfind(searchedSubstring) << endl; if (fib[i].rfind(searchedSubstring) == correctPosition) { cout << i << endl; fibFound = true; break; } } if(!fibFound) cout << "NIE"; return 0; } string addStringNumbers(string num1, string num2) { string sumString; int longestString; bool addOneInMemory = false; char d1, d2; num1.length() > num2.length() ? longestString = num1.length() : longestString = num2.length(); for(int i = 0; i < longestString; i++) { d1 = num1[longestString - i - 1]; d2 = num2[longestString - i - 1]; sumString = addCharNumbers(d1, d2, addOneInMemory) + sumString; } if(addOneInMemory) sumString = "1" + sumString; return sumString; } char addCharNumbers(char d1, char d2, bool &addOneInMemory) { int result = 0; result = d1 - '0' + d2 - '0'; // cout << d1 << " " << d2 << " " << result << endl; if(addOneInMemory) result++; if(result > 9) { result %= 10; addOneInMemory = true; } else addOneInMemory = false; return result + '0'; } void removeLeadingZerosFromString(string & searchedSubstring) { while(searchedSubstring[0] == '0') searchedSubstring.erase(0,1); } |
English