您的位置:首页 > 编程语言 > C语言/C++

【c语言】c语言常见编程题总结(五)

2016-09-21 20:51 483 查看
//50.使用c语言编写函数:unsigned int reverse_bit(unsigned int value);
//这个函数的返回值是value的二进制位模式从左到右翻转后的值

/*方法一:通过位运算取出25的每一位二进制数,取出第一个数乘以2^31,第二个数乘以2^30,依次取出并计算出总和
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
typedef unsigned int unit;
int main()
{
unit reverse_bit(unit value);
int value=0;
int num=0;
scanf("%d",&value);
num=reverse_bit(value);
printf("%u\n",num);
return 0;
}
unit reverse_bit(unit value)
{
int i=0;
unit num=0;
for(i=0;i<32;i++)
{
num+=((value>>i)&1)*pow(2,31-i);
}
return num;
}
*/

/*方法二:通过位运算直接将取出的第一位左移31位,第二位左移30位,设置一个变量进行移位运算,经过循环每一位都进行左移
#include <stdio.h>
int main()
{
unsigned int reverse_bit(unsigned int value);
int value=0;
int num=0;
scanf("%d",&value);
num=reverse_bit(value);
printf("%u\n",num);
return 0;
}
unsigned int reverse_bit(unsigned int value)
{
unsigned int ret=0;
int i=0;
while(i<32)
{
ret<<=1;
ret|=(value>>i)&1;
i++;
}
return ret;
}
*/

/*49.有一个字符串是"student a am i",现编写代码将字符串转换为"i am a student" 要求:空间复杂度是O(1)
//可以先将整个字符串逆序"i ma a tneduts"
//再将每个单词逆序"i am a student"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
int main()
{
void reverse_str(char *left,char *right);
void reverse(char *str);
char str[]="strudent a am i";
reverse(str);
printf("%s\n",str);
return 0;
}
void reverse_str(char *left,char *right)
{
assert(left);
assert(right);
while(left<right)
{
char tmp =*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void reverse(char *str)
{
char *pstart=str;
char *pend=str+strlen(str)-1;
char *pcur=NULL;
if((str==NULL)||(*str=='\0'))
{
return;
}
reverse_str(pstart,pend);
while(*str)
{
pcur=str;
while(*str!='\0'&&*str!=' ')
{
str++;
}
pend=str-1;
reverse_str(pcur,pend);
if(*str==' ')
str++;

}
}
*/

/*48.实现一个函数可以求任意多个整数的平均值(使用可变参数列表)
#include <stdio.h>
#include <stdarg.h>
float averge(int val,...)
{
va_list arg;
int count;
float sum=0.0;
va_start(arg,val);
for(count=0;count<val;count++)
{
sum+=va_arg(arg,int);
}
va_end(arg);
return  sum/ val;
}
int main()
{
float ret=averge(5,1,2,3,4,5);
printf("%f\n",ret);
return 0;
}
*/

/*47.1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水?
#include <stdio.h>
int main()
{
int money=9;
int count=money;
while(1)
{
if(money%2!=0)
{
count=count+money;
break;
}
else
{
money=money/2;
count+=money;
}
}
printf("%d\n",count);
return 0;
}
*/

/*46.将一个数字字符串转换为对应的数字,不考虑溢出。(比如"12.34"转换为数字:12.34)功能类似atof,考虑异常输入
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
int main()
{
double my_atof(char *str);
double ret;
char arr[100];
scanf("%s",arr);
ret=my_atof(arr);
printf("%f\n",ret);
return 0;
}
double my_atof(char *str)
{
double ret=0.0;
int sign=1;
char *point;
while(*str!='\0')
{
if(isspace(*str))
{
str++;
}
else if(*str=='-')
{
sign=-1;
str++;
}
else if((*str=='+'))
{
str++;
}
else if(*str=='.')
{
point=str;
str++;
}
else if((*str>='0')&&(*str<='9'))
{
ret=ret*10.0+(*str-'0');
str++;
}
}
ret=sign*ret/pow(10,str-point-1);
return ret;
}
*/

/*45.(memset)实现内存的设置,功能类似memset,可以以字节为单位设置内存的值,不能使用任何库函数
#include <stdio.h>
#include <assert.h>
int main()
{
void *my_memset(void *s,int ch,int n);
char s1[10];
int i=0;
my_memset(s1,7,7);
for(i=0;i<10;i++)
{
printf("%d ",s1[i]);
}
printf("\n");
return 0;
}
void *my_memset(void *s,int ch,int n)
{
assert(s);
char *dst=(char*)s;
int i=0;
for(i=0;i<n;i++)
{
*(dst+i)=ch;
}
return s;
}
*/

/*44.(memmove)实现内存的移动,功能类似memmove,实现内存重叠拷贝,不能使用任何库函数
//memmove:
//(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝;
//(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝;
//(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝;
#include <stdio.h>
#include <assert.h>
int main()
{
void *my_memmove(void *dst,const void *src,int count);
char p[]="hello-world";
char q[10];
my_memmove(p+1,p,6);
printf("%s\n",p);
my_memmove(q,p,6);
printf("%s\n",q);
return 0;
}
void *my_memmove(void *dst,const void *src,int n)
{
void *ret=dst;
char *p1=(char*)dst;
char *p2=(char*)src;
assert(dst);
assert(src);
if((p2<=p1)&&(p1<=p2+n))
{
p2=p2+n-1;
p1=p1+n-1;
while(n--)
{
*p1=*p2;
p1--;
p2--;
}
}
else
{
while(n--)
{
*p1=*p2;
p1++;
p2++;
}
*p1='\0';
}
return ret;
}
*/

/*43.(memcpy)实现内存的拷贝,功能类似memcpy,可以不实现内存重叠拷贝,不能使用任何库函数
#include <stdio.h>
#include <assert.h>
int main()
{
void *my_memcpy(void *dst,const void *src,int n);
char a[]="hello world";
char b[10];
my_memcpy(b,a,7);
printf("%s\n",b);
return 0;
}
void *my_memcpy(void *dst,const void *src,int n)
{
void *ret=dst;
char *p1=(char*)dst;
char *p2=(char*)src;
assert(dst);
assert(src);
while(n--)
{
*p1++=*p2++;
}
*p1='\0';
return ret;
}
*/

/*memcmp
#include <stdio.h>
#include <assert.h>
int main()
{
int my_memcmp(const void *dst,const void *src,int count);
int a[10]={1,2,3,4,5,6,7,8,9,0};
int b[]={1,1,3};
int ret=my_memcmp(a,b,5);
printf("%d\n",ret);
return 0;
}
int my_memcmp(const void *dst,const void *src,int count)
{
assert(dst);
assert(src);
while(*(char*)dst==*(char*)src)
{
dst=(char*)dst+1;
src=(char*)src+1;
count--;
if(count==0)
{
return 0;
}
}
if(*(char*)dst>*(char*)src)
{
return 1;
}
else
{
return -1;
}
}
*/

/*42.(strcmp)实现字符串的比较,功能类似strcmp,不能使用任何库函数
#include <stdio.h>
int main()
{
int my_strcmp(const char *dest,const char *src);
char s1[50],s2[50];
printf("input s1:");
scanf("%s",s1);
printf("input s2:");
scanf("%s",s2);
int ret=my_strcmp(s1,s2);
printf("%d\n",ret);
return 0;
}
int my_strcmp(const char *str1,const char *str2)
{
int i=0,j=0;
int result;
while((str1[i]==str2[j])&&(str1[i]!='\0'))
{
i++;
j++;
}
if(str1[i]=='\0'&&str2[j]=='\0')
{
result=0;
}
else
{
result=str1[i]-str2[j];
}
return result;
}
*/

/*41.(strcat)实现字符串的连接,功能类似strcat,不能使用任何库函数
#include <stdio.h>
int main()
{
char *my_strcat(char *dest,const char *src);
char s1[50],s2[50];
printf("input s1:");
scanf("%s",s1);
printf("input s2:");
scanf("%s",s2);
my_strcat(s1,s2);
printf("s1:%s\n",s1);
return 0;
}
char *my_strcat(char *dest,const char *src)
{
int i=0,j=0;
char *t=dest;
while(dest[i]!='\0')
{
i++;
}
while(src[j]!='\0')
{
dest[i++]=src[j++];
}
dest[i]='\0';
return t;
}
*/
/*40.(strcpy)实现字符串的拷贝,功能类似strcpy,不能使用任何库函数
#include <stdio.h>
#include <assert.h>
int main()
{
char *my_strcpy(char *dest,const char *src);
char s1[50],s2[50];
printf("input s2:");
scanf("%s",s2);
my_strcpy(s1,s2);
printf("s1:%s\n",s1);
return 0;
}
char *my_strcpy(char *dest,const char *src)
{
assert(dest);
assert(src);
char *t=dest;
while((*dest++=*src++)!='\0')
{
}
return t;
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: