0


考研C语言操作数以及函数刷题基础刷题

第一题 两数交换不用第三个参数(面试题)

不用引用第三个参数,实现两个数交换。

方法一:使用算数方法

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>

//不用第三个参数实现两个数交换

//方法一:算数方法

int main()
{
    int a = 5;
    int b = 3;
    
    a = a + b;
    b = a-b;
    a = a-b;
    printf("%d\n", a);
    printf("%d\n", b);
    return 0;
    
}

方法二:异或

^异或操作符的意思是,相同为0,相异为1;所以可以实现交换。

a = a ^ b;    //0011^0101=0110=6
 b = a ^ b;    //0110^0101=0011=3
 a = a ^ b;    //0110^0011=0101=5
//方法二:逻辑异或
int main()
{
    int a = 3;
    int b = 5;
    a = a ^ b;    //0011^0101=0110=6
    b = a ^ b;    //0110^0101=0011=3
    a = a ^ b;    //0110^0011=0101=5
    printf("%d\n", a);
    printf("%d\n", b);
    return 0;
    

第二题:将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010

将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010

//将10:0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010
int main()
{
    int a = 10;
    //10 = 0000 0000 0000 0000 0000 0000 1010
    //或上 0000 0000 0000 0000 0000 0001 0000
    //0000 0000 0000 0000 0000 0001 0000 由0000 0000 0000 0000 0000 0000 0001左移四位获得
    a |= (1 << 4);
    printf("%d\n", a);
    return 0;
}

将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010

//将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010

int main()
{
    int a = 26;
    //26 = 0000 0000 0000 0000 0000 0001 1010 
    //与上 1111 1111 1111 1111 1111 1110 1111
    //1111 1111 1111 1111 1111 1110 1111由1111 1111 1111 1111 1111 1111 1111 1110向左移动4位
    //1111 1111 1111 1111 1111 1111 1111 1110可由 0000 0000 0000 0000 0000 0001取反获得
    a &= ~(1 << 4);
    printf("%d\n", a);
    return 0;
}

第三题 判断闰年

闰年:

  1. 能被4整除,但不能被100整除

2.或者能被400整除的年叫闰年

  1. 闰年必须是400的倍数,否则为平年
//打印打印1000年到2000年之间的闰年

int main()
{
    int i = 1000;
    for (i = 1000; i <= 2000; i++)
    {
        if(i%4==0&&i%100!=0||i%400==0)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

判断是不是闰年

int main()
{
    /*int i = 1000;
    for (i = 1000; i <= 2000; i++)
    {
        if(i%4==0&&i%100!=0||i%400==0)
        {
            printf("%d ", i);
        }
    }*/
    int i = 0;
    scanf("%d", &i);
        if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
        {
            printf("是闰年\n");
        }
        else
        {
            printf("不是闰年\n");
        }
    
    return 0;
}

第四题:最大公约数

注意:

  1. 两个scanf后面不要加空格或\n要不然编译器不知道什么时候为输入完。

  2. 两个for循环是可以合并成一个的。

//最大公约数

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d", &n);
    scanf("%d", &m);
    int i = 0;
    int sum = 0;
    for(i=1;i<n&&i<m;i++)
    {
        if(n%i==0&&m%i==0)
        {
            sum = i;
        }
    }
    printf("最大公约数为%d\n", i);
    return 0;
}

第五题:输出100-200之间的素数

注意:

1.先遍历100-200

2.在遍历2——(n-1)

3.如果2——(n-1)之间存在不是素数的就break;

4.如果循环到最后,如果i=n-1,那么就是素数。

//打印100-200素数

int main()
{
    int i = 0;
    int j = 0;
    for(i=100;i<200;i++)
    {
        for(j=2;j<i;j++)
        {
            if (i % j == 0)
            {
                break;
            }
        }
        if(i==j)
        {
            printf("%d ", i);
        }
        
    }
    return 0;
}

第六题:乘法口诀表

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

如:输入9,输出99口诀表,输出12,输出1212的乘法口诀表。

//在屏幕上输出9*9乘法口诀表
void mul(int n)
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            printf("%d*%d=%d ", j, i, j * i);
        }
        printf("\n");
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    mul(n);
    return 0;
}

第七题: 完成对数组的操作

创建一个整形数组,完成对数组的操作

  1. 实现函数init() 初始化数组为全0
  2. 实现print() 打印数组的每个元素
  3. 实现reverse() 函数完成数组元素的逆置。

要求:自己设计以上函数的参数,返回值。

//初始化为0
void init(int arr[], int n)
{
    for(int n=0;n<10;n++)
    {
        arr[n] = 0;
    }
    for(int j=0;j<10;j++)
    {
        printf("%d", arr[j]);
    
    }
    printf("\n");
}
//打印数组
void print(int arr[], int n)
{
    for (int j = 0; j < 10; j++)
    {
        printf("%d", arr[j]);
    }
    printf("\n");

}
//置逆数组
void reverse(int arr[],int n)
{
    int left = 0;
    int right = n - 1;
    int sum = 0;
    while(left<right)
    {
        sum = arr[right];
        arr[right] = arr[left];
        arr[left] = sum;
        left++;
        right--;
    }
    for (int j = 0; j < 10; j++)
    {
        printf("%d", arr[j]);
    }
    printf("\n");

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

第八题:冒泡排序

//冒泡排序
void bubble(int arr[], int n)
{
    int i = 0;
    int j = 0;
    int tmp = 0;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(arr[j] > arr[j+1])
            {
                tmp = arr[j ];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }

}
int main()
{
    int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
    bubble(arr, 10);
    for(int i=0;i<10;i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

第九题:统计二进制中1的个数

方法一:%与/方法

用%2,/2的方法。

例如15的二进制 0000.......0000 1111。四个1

注意 :负数的情况

如 -1:在计算机中是以补码的情况存储。

-1的补码为:1111 1111 1111 1111 1111 1111 1111 1111

-1%2=-1;-1模2余-1

-1/2=0; -1除2,不够除,所以整数为0;所以会导致i不会++。结果为0;

所以我们需要用无符号整形 unsigned int,让-1的每一位都是有效位。

//统计二进制中1的个数

void fun(unsigned int n)
{
    int sum = 0;
    int i = 0;
    while(n)
    {
        sum = n % 2;
        n = n / 2;
        if (sum == 1)
            i++;
    }
    printf("%d", i);
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    fun(n);
    return 0;
}

方法二: 移位运算和位运算,循环32位

//方法二
void fun(int n)
{
    int count = 0;
    for(int i=0;i<32;i++)
    {
        if((n>>i)&1==1)
        {
            count++;
        }
    }
    printf("%d", count);
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    fun(n);
    return 0;
}

每一位都与1做与运算,双1为1。i从0开始,到32位结束。

因为,int是4字节,字节8位。计算机中都是以补码存储。

方法三: 只循环1的个数的次数(难)

用n&(n-1),这样在二进制可以每次都减少一个1,循环了几次就有几个1。

//方法三

void fun(int n)
{
    int i = 0;
    while(n)
    {
        n = n & (n - 1);
        i++;
    }
    printf("%d", i);
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    fun(n);
    return 0;
}

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

void fuc(int n)
{
    for(int i=30;i>=0;i -=2)
    {
        printf("%d ", (n >> i) & 1);
    }
    printf("\n");
    for(int j=31;j>=0;j-=2)
    {
        printf("%d ", (n >> j) & 1);
    }

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

第十一题 :比较二进制位数不同个数

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

输入例子:

1999 2299

输出例子:7

分别将这两个数的每一位取出来比较。

//比较二进制位数
void func(int n,int m)
{
    int count = 0;
    for(int i=0;i<32;i++)
    {
        if (((n >> i) & 1) != ((m >> i) & 1))
            count++;
    }
    printf("%d", count);
}
int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    func(n, m);
    return 0;
}


本文转载自: https://blog.csdn.net/qq_62830324/article/details/135887737
版权归原作者 深中笃行 所有, 如有侵权,请联系我们删除。

“考研C语言操作数以及函数刷题基础刷题”的评论:

还没有评论