一.数组逆序
例:arr[10]={1,2,3,4,5,6,7,8,9,10},将其逆置使得arr[10]={10,9,8,7,6,5,4,3,2,1};
#include<stdio.h>
template<typename T>
void Inverse(T *arr,int n)
{
T tmp;
for(int i=0;i<n/2;i++)
{
tmp=arr[i];
arr[i]=arr[n-1-i];
arr[n-1-i]=tmp;
}
}
int main()
{
int i;
int arr[]={1,2,3,4,5,6,7,8,9,10};
float brr[]={1.1f,2.2f,3.3f,4.4f,5.5f,6.6f,7.7f,8.8f,9.9f,10.1f};
double crr[]={1.11,2.22,3.33,4.44,5.55,6.66,7.77,8.88,9.99,10.10};
Inverse(arr,sizeof(arr)/sizeof(arr[0]));
for(i=0;i<10;i++)
{
printf("%3d",arr[i]);
}
printf("\n");
Inverse(brr,sizeof(brr)/sizeof(brr[0]));
for(i=0;i<10;i++)
{
printf("%10f",brr[i]);
}
printf("\n");
Inverse(crr,sizeof(crr)/sizeof(crr[0]));
for(i=0;i<10;i++)
{
printf("%10f",crr[i]);
}
printf("\n");
return 0;
}
结果:
上述代码使用了C++的模板函数知识,为了使本函数可以适应多种类型的数组
如只需一种类型,只需删除
template<typename T>
再将函数内部的 T 改为所需的类型即可。
本函数若要实现字符数组的逆置,在传递函数参数时应注意传递的长度应为strlen(字符数组名)或sizeof(字符数组名)-1
二.字符串逆置
例:char arr[]="abcdefghijklmn",将其逆置使得arr[]="nmlkjihgfedcba";
#include<stdio.h>
#include<string.h>
void Inverse(char *arr)
{
char *p=&arr[strlen(arr)-1];
char tmp;
while(arr<p)
{
tmp=*arr;
*arr=*p;
*p=tmp;
arr++;
p--;
}
}
int main()
{
char arr[]="abcdefghijklmn";
Inverse(arr);
printf("%s\n",arr);
return 0;
}
结果:
三.二进制逆置
例:25的二进制为 0000 0000 0000 0000 0000 0000 0001 1001
逆置完成后为 1001 1000 0000 0000 0000 0000 0000 0000
#include<stdio.h>
unsigned int Reverse_bit(unsigned int n)
{
unsigned int m = 0;
for(int i=0;i<32;i++)
{
m = (m<<1)|(n&1);
n >>= 1;
}
return m;
}
int main()
{
printf("%x\n",Reverse_bit(25));
return 0;
}
结果:
四.数字逆置
例:123逆置为 321
#include<stdio.h>
int Reverse(int n)
{
int tmp=0;
while(n!=0)
{
tmp=tmp*10+(n%10);
n/=10;
}
return tmp;
}
int main()
{
printf("%3d\n",Reverse(-1234));
return 0;
}
结果:
注:若数字后面全为0,如100,1000,12340000,则会输出1,1,4321,因为001==1,0001==1,00004321==4321,编译器并不会输出前面的0.