1.求二进制中不同位的个数
题目:两个int(32位)整型整数m和n的二进制中,求有多少个不同的位(bit).
输入:6 5
输出:2
知识点:
1)异或^:相同为0,相异为1
2)m&(m-1);//每一次按位与&操作都会使得后面一个1置换为0
#include<stdio.h>
int count_bit_one(int m){
int count=0;
while(m){
m=m&(m-1);//011 010 --> 010 001--->000
count++;
}
return count;
}
int get_diff_bit(int m,int n){
int tmp = m^n;//异或:相同为0,相异为1 ,110^101=011
return count_bit_one(tmp);
}
int main(){
int m;//6D=110B
int n;//5D=101B
scanf("%d %d",&m,&n);
int count=get_diff_bit(m,n);
printf("count = %d\n",count);
return 0;
}
运行结果:
6 5
count = 2
2.九九乘法表
题目:九九乘法表
#include<stdio.h>
int print_table(num){
int i=0;
for(i=1;i<=num;i++){
int j=0;
for(j=1;j<=i;j++){
printf("%d*%d=%-4d",i,j,i*j);
}
printf("\n");
}
}
int main(){
int num;
scanf("%d",&num);
print_table(num);
return 0;
}
运行结果:
9
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
3.字符串逆排列。
题目:编写一个函数reverse_string(char * string),将参数字符串中的字符串逆序排列。
输入:abcdefg
输出:gfedcba
法一:使用库函数
#include<stdio.h>
#include<string.h>
//法一 :调用库函数
void reverse_string(char arr[]){ //或者void reverse_string(char *arr)
int left=0;
int right=strlen(arr)-1;//只计算显示在屏幕上的字符
while(left<right){
char tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
left++;
right--;
}
}
int main(){
char arr[]="abcdefg";//内存中的arr是"abcdefg\0"
reverse_string(arr);
printf("%s\n",arr);
return 0;
}
法二:自定义库函数
#include<stdio.h>
#include<string.h>
//法二 :自定义函数
int my_strlen(char *str){
int count=0;
while(*str!='\0'){
count++;
str++;
}
return count;
}
//注释:
//char arr[]="abcd";
//printf("%p\n",arr);---地址
//printf("%c\n",*arr);---地址解引用
//printf("%p\n",(arr+1));---地址
//printf("%c\n",*(arr+1));---解地址引用
void reverse_string(char arr[]){//或者void reverse_string(char *arr)
int left=0;
int right=my_strlen(arr)-1;//只计算显示在屏幕上的字符
while(left<right){
char tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
left++;
right--;
}
}
int main(){
char arr[]="abcdefg";//内存中的arr是"abcdefg\0"
reverse_string(arr);
printf("%s\n",arr);
return 0;
}
法三:递归
#include<stdio.h>
#include<string.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];
int len = my_strlen(arr);
arr[0]=arr[len-1];
arr[len-1]='\0';
if(my_strlen(arr+1)>1){
reverse_string(arr+1);
}
arr[len-1]=tmp;
}
int main(){
char arr[]="abcdefg";//内存中的arr是"abcdefg\0"
reverse_string(arr);
printf("%s\n",arr);
return 0;
}
运行结果:
gfedcba
4.输入一个非负数,返回组成它的数字之和
题目:写一个递归函数DigitSum(n),输入一个非负数,返回组成它的数字之和
例如:调用DigitSum(1729),则返回1+7+2+9,和是19.
输入:1729
输出:19
#include<stdio.h>
//分析
//输入1729,输出19(19=1+7+2+9)
//DigitSum(1729)
//DigitSum(172)+1729%10
//DigitSum(17)+172%10+1729%10
//DigitSum(1)+17%10+172%10+1729%10
// 1+7+2+9
int DigitSum(unsigned int n){
if(n>9){
return DigitSum(n/10)+n%10;
}
else{
return n;
}
}
int main(){
unsigned int num=0;//内存中的arr是"abcdefg\0"
scanf("%d",&num);//1729
int ret=DigitSum(num);
printf("ret = %d\n",ret);
return 0;
}
运行结果:
1729
ret = 19
5.递归实现n的k次方
递归实现n的k次方,使用递归实现。
#include<stdio.h>
//递归
double Pow(int n,int k){
//n^k=n*Pow(n,k),对k的情况进行讨论
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 = %.2f\n",ret);
return 0;
}
运行结果:
2 3
ret = 8.00
-----------END-----------