一些例题8 13

sizeof()的特性:

#include<stdio.h>
int i;//全局变量,未初始化默认为0
int main()
{i--;//-1
if(i>sizeof(i))
{
printf(">\n");
else{
printf("<\n");}
return 0;}//最后结果是>:因为sizeof()打印出来的是一个无符号数,所以再i和sizeof(i)进行比较的时候,会将i处理为无符号数,即一个特别大的整数

逗号表达式的优先级最低:

#include<stdio.h>
int main()
{
int a,b,c;
a=5;
c=++a;
b=++c,c++,++a,a++;//先算赋值,再算逗号表达式
b+=a++ +c;
printf("a=%d b=%d c=%d\n",a,b,c);//9 23 8

一.求一个数字再内存中的二进制中1的个数:

方法1:模2除2的方法

#include<stdio.h>
int count_bit_one(unsigned int n)//形参类型为无符号型,这样接受的是负数也可以
{
int count =0;
while(n)
{
if(n%2==1)
{count ++;
}
n=n/2;}
return count;}
int main()
{int a=0;
scanf("%d",&a);
int count=count_bit_one(a);
printf("%d\n",count);
return 0;}

方法2:循环移动  按位与1

#include<stdio.h>
int count_bit_one(int n)
{
int count=0;
int i=0;
for(i=0;i<32;i++){
if(((n>>i)&1)==1)
{count++;
}}
return count;}
int main()
{
int a=0;
scanf("%d",&a);
int count=count_bit_one(a);
printf("%d\n",count);
return 0;}

方法3:n=n&(n-1):最精简的算法

int count_bit_one(int n)
{
int count=0;
while(n){
n=n&(n-1);
count++;
}
return count;}

二.求二进制中不同位的个数:两个int(32位)整数m和n的二进制表达式中,有多少个bit位不同。

思路:先利用异或得到一个数,再求该数中二进制1的个数。

#include<stdio.h>
int get_diff_bit(int m,int n)
{
int tmp=m^n;
int count=0;
while(tmp){
tmp=tmp&(tmp-1);
count++;}
return count;}
int main()
{
int m=0;
int n=0;
scanf("%d%d",&m,&n);
int count=get_diff_bit(m,n);
printf("%d\n",count);
return 0;}

三.打印二进制的奇数位和偶数位:获取一个整数二进制序列中的所有偶数和奇数位,分别打印出二进制序列。

#include<stdio.h>
void print(int n){
int i=0;
printf("奇数位:\n");
for(i=30;i>=0;i-=2){
printf("%d",(m>>i)&1);}
printf("\n");
printf("偶数位:\n");
for(i=31;i>=1;i-=2){
printf("%d ",(m>>i)&1);
}
printf("%d\n");}


int main(){
int m=0;
scanf("%d",&m);
print(m);
return 0;}

四.使用指针打印数组内容:写一个函数打印arr数组的内容,不使用数组下标,使用指针,arr是一个整型一维数组。

void print(int *p,int sz){
int i=0;
for(i=0;i<sz;i++){
printf("%d ",*(p+i));
}}

int main()
{
int arr[]={1,2,3,4,5,6,7,8,9};
int sz=sizeof(arr)/sizeof(arr[0]);
print(arr,sz);
return 0;}

五.实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定,如:输入9,输出9*9口诀表;输入12,输出12*12口诀表。

#include<stdio.h>
void print_table(int n){
int i=0;
for(i=1;i<=n;i++){
int j=0;
for(j=1;j<=i;j++)
{
printf("%d*%d=%-3d",i,j,i*j);}
printf("\n");
}}
int main(){
int n=0;
scanf("%d",&n);
print_table(n);
return 0;}

六:字符串逆序:编写一个函数用递归实现,将参数字符反向排列,不能使用c库函数中的字符串操作函数。

1.循环方式实现:

#include<stdio.h>
int my_strlen(char *str)
{
int count=0;
while(*str !='\0'){
count++;
str++;}
return count;}

void reverse_string(char arr[]){
int left=0;
int right=my_strlen(arr)-1;
while(left<right){
int tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
left++;
right--;}}

int main()
{
char arr[]="abcdef";
reverse_string(arr);
printf("%s\n",arr);
return 0;}

2.递归来实现:

#include<stdio.h>
int my_strlen(char *str)
{
int count=0;
while(*str!='\0')
{
count++;
str++;
}
return count;}
void reverse_string(char arr[]){
char tmp=arr[0];//1
int len=my_strlen(arr);
arr[0]=arr[len-1];//2
arr[len-1]='\0';//3
if(my_strlen(arr+1)>=2)
{
reverse_string(arr+1);//3
arr[len-1]=tmp;//4

int main()
{
char arr="abcdef";
reverse_string(arr);
printf("%s\n",arr);


return 0;}

七:计算一个数的每位之和,递归实现:写一个函数digitsum(n),输入一个非负整数,返回组成它的数字之和,例如digitsum(1729),则返回19。

思路:digitsum(1729)=digitsum(172)+9=digit(17)+2+9=...

#include<stdio.h>
int digitsum(unsigned int num){
if(num>9)
{
return digitsum(num/10)+num%10;
}
else
{
return num;
}

int main(){
unsigned int num=0;
scanf("%d",&num);
int ret=digitsum(num);
printf("ret=%d\n",ret);

return 0;}

八.递归实现n的k次方:编写一个函数实现n的k次方,使用递归实现。

#include<stdio.h>
double pow(int n,int k)
{//n^k=n*n^(k-1)
if(k<0)
{
return (1.0/pow(n,-k));
}
else if(k==0){
return 1;}
else{
return n*pow(n,k-1);}}
int main()
{int n=0;
int k=0;
scanf("%d%d",&n,&k);
double ret=pow(n,k);
printf("ret=%lf\n",ret);
return 0;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值