yuxiaohui78
BAN USERGood algorithm!
But if the size of the given array is very huge, like 1000000, and under the worst situation, like this
rotate_right(arr, sizeof(arr)/sizeof(arr[0]), 1);
how to solve the stack overflow problem?
C solution:
#include <stdio.h>
#include <math.h>
void print_subset(int *org_set, unsigned int set_map)
{
unsigned int i = 0;
printf ("{");
for (i = 0; set_map; i ++)
{
if (set_map & 0x1)
{
printf ("%d,", org_set[i]);
}
set_map >>= 1;
}
printf ("\b}");
}
int main (int argc, char *argv[])
{
int org_set[] ={1,2,3, 9,300,56, 7, 90};
unsigned int set_map = pow(2,sizeof(org_set)/sizeof(int));
unsigned int i = 0;
printf ("The number of subset is : %d\n", set_map);
printf ("{NULL}\n");
for (i = 1; i < set_map; i ++)
{
print_subset (org_set, i);
printf ("\n", i);
}
return 0;
}
{{
#include <stdio.h>
#include <string.h>
int is_palindromes( char * str, int str_len)
{
int len = str_len;
int i = 0;
for ( i = 0; i < len/2; i ++)
{
if (str[i] == str[len - i - 1])
continue;
else
return 0;
}
return 1;
}
void print_palindromes (char *str, int len)
{
int i = 0;
for (i = 0; i < len; i ++)
{
printf("%c", *(str+i));
}
printf ("\n");
}
int main (int argc, char *argv[])
{
int num_of_parl = 0;
int i = 0;
int len = 0;
char *pStr = argv[1];
if (argc != 2)
{
printf ("Need Parameter string!\n");
return 1;
}
printf ("Input string:\n%s\n\n", pStr);
len = strlen (pStr);
printf ("Parlindromes:\n");
for (i = 0; i < len; i ++)
{
int j = 0;
int sub_str_len = strlen(pStr + i);
for (j = 2; j <= sub_str_len; j ++)
{
if (is_palindromes (pStr + i, j))
{
print_palindromes (pStr + i, j);
num_of_parl ++;
}
}
}
printf ("\nNumber of palindromes:%d\n", num_of_parl );
return 0;
}
}}
--------------------------
The result of testing.
./parlindromes abcdefedcdef
Input string:
abcdefedcdef
Parlindromes:
cdefedc
defed
efe
fedcdef
edcde
dcd
Number of parlindromes:6
#include <stdio.h>
#include <string.h>
int is_parlindromes( char * str, int str_len)
{
int len = str_len;
int i = 0;
for ( i = 0; i < len/2; i ++)
{
if (str[i] == str[len - i - 1])
continue;
else
return 0;
}
return 1;
}
void print_parlindromes (char *str, int len)
{
int i = 0;
for (i = 0; i < len; i ++)
{
printf("%c", *(str+i));
}
printf ("\n");
}
int main (int argc, char *argv[])
{
int num_of_parl = 0;
int i = 0;
int len = 0;
char *pStr = argv[1];
if (argc != 2)
{
printf ("Need Parameter string!\n");
return 1;
}
printf ("Input string:\n%s\n\n", pStr);
len = strlen (pStr);
printf ("Parlindromes:\n");
for (i = 0; i < len; i ++)
{
int j = 0;
int sub_str_len = strlen(pStr + i);
for (j = 2; j <= sub_str_len; j ++)
{
if (is_parlindromes (pStr + i, j))
{
print_parlindromes (pStr + i, j);
num_of_parl ++;
}
}
}
printf ("\nNumber of parlindromes:%d\n", num_of_parl );
return 0;
}
--------------------------
The result of testing.
./parlindromes abcdefedcdef
Input string:
abcdefedcdef
Parlindromes:
cdefedc
defed
efe
fedcdef
edcde
dcd
Number of parlindromes:6
Thanks for Diego Giagio's explanation. I used the compiling parameter -O2, it works.
- yuxiaohui78 November 14, 2013