C语言算法
字符类算法
—判断回文字符串
int fun ( char * str)
{
char * p= str;
int n, i;
while ( * p) {
n++ ;
p++ ;
}
for ( i= 0 ; i< n/ 2 ; i++ )
if ( str[ i] == str[ n- i- 1 ] ) ;
else return 0 ;
return 1 ;
}
—实现字符串逆置
void fun ( char * s)
{
char ch;
int i, m, n;
i= 0 ;
m= n= strlen ( s) - 1 ;
while ( i< n/ 2 )
{
ch= s[ i] ;
s[ i] = s[ m] ;
s[ m] = ch;
i++ ;
m-- ;
}
}
—统计字符串单词个数
int fun ( char * str)
{
int n;
char * p= str;
while ( * p) {
if ( * p!= ' ' && ( * ( p+ 1 ) == ' ' || * ( p+ 1 ) == '\0' ) ) n++ ;
p++ ;
}
return n;
}
—输出较长的字符串
char * fun ( char * s, char * t)
{
int i, j;
for ( i= 0 ; s[ i] != '\0' ; i++ ) ;
for ( j= 0 ; t[ j] != '\0' ; j++ ) ;
if ( i> j) return s;
else return t;
}
—找出二维数组中的最长字符串
char * fun ( char ( * s) [ 81 ] , int num)
{
int i;
char * max;
max= s[ 0 ] ;
for ( i= 1 ; i< num; i++ )
{
if ( strlen ( max) < strlen ( s[ i] ) ) max= s[ i] ;
}
return max;
}
int main ( ) {
int num= 3 ;
char a[ 3 ] [ 81 ] = { "dafaf" , "dawfawfaf" , "dawfawfawf" } ;
printf ( "%s" , fun ( a, 3 ) ) ;
}
—将字符型数字转换为整型
方法一
long fun ( char * s)
{
char * p= s;
long sum= 0 ;
while ( * p) {
sum= sum* 10 + * p- '0' ;
p++ ;
}
return sum;
}
方法二
#include <string.h>
long fun ( char * s)
{
long sum;
int i, len;
len= strlen ( s) ;
for ( i= 0 ; i< len; i++ )
sum= sum* 10 + * ( s+ i) - '0' ;
return sum;
}
—将字符型数字转换为整型(带正负)
long fun ( char * p)
{
int flag= 0 ;
long sum= 0 ;
if ( * p== '+' )
{
p++ ;
flag= 1 ;
}
else if ( * p== '-' )
{
p++ ;
flag= - 1 ;
}
while ( * p) {
sum= sum* 10 + * p- '0' ;
p++ ;
}
return flag* sum;
}
—字符串逐个前移
void fun ( char * str, int m)
{
char c;
int i, j;
for ( i= 1 ; i<= m; i++ )
{
t= str[ 0 ] ;
for ( j= 1 ; str[ j] != '\0' ; j++ )
str[ j- 1 ] = str[ j] ;
str[ j- 1 ] = t;
}
}
—实现复制字符串
void fun ( char * s, char * a)
{
int i;
for ( i= 0 ; i< N; i++ , a++ )
s[ i] = * a;
}
—统计数字字符个数
int fun ( char * s)
{
int digit;
char * p= s;
while ( * p)
{
if ( * p< '9' && * p> '0' ) digit++ ;
p++ ;
}
return digit;
}
—统计字母字符个数
int fun ( char * s)
{
int ch;
char * p= s;
while ( * p)
{
if ( * p< 'z' && * p> 'a' || * p< 'Z' && * p> 'A' ) ch++ ;
p++ ;
}
return ch;
}
—实现删除字符串中的指定字符
#数组类型
void fun ( char a[ ] , char b[ ] , int n)
{
int i, k= 0 ;
for ( i= 0 ; a[ i] != '\0' ; i++ )
if ( i!= n) b[ k++ ] = a[ i] ;
b[ k] = '\0' ;
}
#指针类型
void fun ( char s[ ] , int c)
{
int i= 0 ;
char * p;
p= s;
while ( * p)
{
if ( * p!= c) s[ i++ ] = * p;
p++ ;
}
s[ i] = '\0' ;
}
—找出ASCII码为偶数的字符
void fun ( char * s, char t[ ] )
{
int k= 0 ;
char * p= s;
while ( * p) {
if ( * p% 2 == 0 ) t[ k++ ] = * p;
p++ ;
}
t[ k] = '\0' ;
}
—去掉字符串前面的"*"
void fun ( char * a )
{
int k= 0 ;
char * p= a;
while ( * p== '*' ) p++ ;
while ( * p!= '\0' ) a[ k++ ] = * p, p++ ;
}
—去掉字符串中间的"*"
void fun ( char * a, char * h, char * p )
{
int k= 0 ;
char * s= a;
while ( s< h)
{
a[ k++ ] = * s;
s++ ;
}
while ( s<= p)
{
if ( * s!= '*' ) a[ k++ ] = * s;
s++ ;
}
while ( * s)
{
a[ k++ ] = * s;
s++ ;
}
a[ k] = '\0' ;
}
—保留字符串前面的指定位数的"*"
void fun ( char * a, int n )
{
int k= 0 , i= 0 ;
char * p, * t;
p= t= a;
while ( * t== '*' )
{
k++ ;
t++ ;
}
if ( k> n)
while ( * p)
{
a[ i++ ] = * ( p+ k- n) ;
p++ ;
}
}
—去掉字符串后面的"*"
void fun ( char * a )
{
while ( * a) a++ ;
a-- ;
while ( * a== '*' ) a-- ;
* ( a+ 1 ) = '\0' ;
}
—消除字符串两边的"*"
void fun ( char * a, int n, int h, int e )
{
int i, j= 0 ;
for ( i= h; i< n- e; i++ )
a[ j++ ] = a[ i] ;
a[ j] = '\0' ;
}
—消除字符串前面和中间的"*"
void fun ( char * a, char * p )
{
int k= 0 ;
char * h= a;
while ( h< p)
{
if ( * h!= '*' ) a[ k++ ] = * h;
h++ ;
}
while ( * h!= '\0' )
{
a[ k++ ] = * h;
h++ ;
}
a[ k] = '\0' ;
}
—对字符串按ASCII码降序排列
void fun ( char * s, int num)
{
char ch;
int i, j;
for ( i= 1 ; i< 6 ; i++ )
for ( j= i+ 1 ; j< 6 ; j++ )
{
if ( * ( s+ i) < * ( s+ j) )
{
ch= * ( s+ j) ;
* ( s+ j) = * ( s+ i) ;
* ( s+ i) = ch;
}
}
}
—统计字符串中单词的个数
void fun ( char * tt, int pp[ ] )
{
int i;
for ( i= 0 ; i< 26 ; i++ )
pp[ i] = 0 ;
for ( ; * tt!= '\0' ; tt++ )
if ( * tt>= 'a' && * tt<= 'z' )
pp[ * tt- 'a' ] ++ ;
}
—结构体中字符串的比较与赋值
typedef struct
{ char num[ 10 ] ;
int s;
} STREC;
STREC fun ( STREC * a, char * b )
{
int i;
STREC str= { "\0" , - 1 } ;
for ( i= 0 ; i< N; i++ )
if ( strcmp ( a[ i] . num, b) == 0 )
str= a[ i] ;
return str;
}
数组类算法
—外层元素累加
#define M 3
#define N 3
int fun ( int a[ M] [ N] )
{
int i, j, sum= 0 ;
for ( i= 0 ; i< M; i++ )
for ( j= 0 ; j< N; j++ )
if ( i== 0 || i== M- 1 || j== 0 || j== N- 1 ) sum+ = a[ i] [ j] ;
return sum;
}
—行列互换(适用于行等于列)
void fun ( int a[ 3 ] [ 3 ] )
{
int i, j, t;
for ( i= 0 ; i< 3 ; i++ )
for ( j= i+ 1 ; j< 3 ; j++ )
{
t= a[ i] [ j] ;
a[ i] [ j] = a[ j] [ i] ;
a[ j] [ i] = t;
}
}
—取左下角,右上角,对称轴元素
#include <stdio.h>
#define M 3
#define N 3
int fun ( int a[ M] [ N] )
{
int i, j;
printf ( "数组元素:" ) ;
for ( i= 0 ; i< M; i++ )
for ( j= 0 ; j< N; j++ )
{
if ( j% M== 0 ) printf ( "\n" ) ;
printf ( "%3d" , a[ i] [ j] ) ;
}
printf ( "\n左下角元素:" ) ;
for ( i= 0 ; i< M; i++ )
for ( j= i+ 1 ; j< N; j++ )
printf ( "%3d" , a[ j] [ i] ) ;
printf ( "\n右上角元素:" ) ;
for ( i= 0 ; i< M; i++ )
for ( j= i+ 1 ; j< N; j++ )
printf ( "%3d" , a[ i] [ j] ) ;
printf ( "\n对称轴:" ) ;
for ( i= 0 ; i< M; i++ )
for ( j= 0 ; j< N; j++ )
if ( i== j)
printf ( "%3d" , a[ i] [ j] ) ;
}
int main ( ) {
int i, j;
int a[ M] [ N] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ;
fun ( a) ;
}
输出:
>> 数组元素:
>> 1 2 3
>> 4 5 6
>> 7 8 9
>> 左下角元素: 4 7 8
>> 右上角元素: 2 3 6
>> 对称轴: 1 5 9
—数值数组二维转一维
int fun ( int a[ M] [ N] , int b[ M* N] )
{
int i, j, k= 0 ;
for ( i= 0 ; i< M; i++ )
for ( j= 0 ; j< N; j++ )
b[ k++ ] = a[ i] [ j] ;
}
—字符数组二维转一维
int fun ( char a[ M] [ N] , char b[ M* N] )
{
int i, j, k= 0 ;
for ( i= 0 ; i< M; i++ )
for ( j= 0 ; a[ i] [ j] != '\0' ; j++ )
b[ k++ ] = a[ i] [ j] ;
}