C语言练习题

以下是自己学习C语言时巩固所学编写的一部分程序,再接再厉!

九九乘法表

在这里插入图片描述

#include <stdio.h>

void main()
{
    int i,j;
    for(i = 1; i <= 9; i++)//控制行
    {
        for(j = 1; j <= i; j++)//控制列
        {
            printf("%d*%d=%-3d",j,i,i*j);
        }
        puts("");//puts输出自动换行
    }

}
三位数分别取出个十百位
#include <stdio.h>

void main()
{
    int n;
    scanf("%d",&n);

    int ge,shi,bai;//分别存个位,十位,百位
    ge = n%10;
    shi = n/10%10;
    bai = n/100%10;

    printf("输入:%d\n个位:%d\n十位:%d\n百位:%d\n",n,ge,shi,bai);

}

在这里插入图片描述

判断闰年
#include <stdio.h>

void main()
{
    int year;
    scanf("%d",&year);

    if(year % 4 == 0)
    {
        //能被4整除,且能被400整除
        if(year % 400 == 0)
        {
            printf("Yes!\n");
        }
        //能被4整除,且不能被100整除
        else if(year % 100 != 0)
        {
            printf("Yes!\n");
        }
        else
        {
            printf("No!\n");
        }
    }
    else
    {
        printf("No!\n");
    }
}

在这里插入图片描述

十进制数转二进制数中1的个数
#include <stdio.h>

void main()
{
    int n, count = 0;
    scanf("%d",&n);
    
/* 方法一
    while(n)
    {
        n = n & (n-1);
        count++;
    }
*/

/* 方法二
    while(n)
    {
        n = n/2;
        count++;
    }
*/
    /* 方法三 */
    int i = 0;
    while(i < 31)//int型数据占4字节,32bit,最高位为符号位
    {
        if((n & (1 << i)) != 0)
        {
            count++;
        }
        i++;
    }

    printf("二进制1的个数为:%d\n",count);
}

在这里插入图片描述

范围内的素数
#include <stdio.h>

void main()
{
    int i,j,count = 0;
    /* 设范围为 101 -- 500 之间*/
    for(i = 101; i <= 500; i++)//遍历范围内所有数
    {
        for(j = 2; j < i; j++)//遍历除了1和本身以外的
        {
            if(i%j == 0) break;//有因数不是素数,退出循环
        }

        if(i == j) count++;//i==j表示j遍历完没发现因数,即i是素数
    }

    printf("101-500之间素数个数:%d\n",count);
}

在这里插入图片描述

阶乘(非递归)
#include <stdio.h>

void main()
{
    int n;
    scanf("%d",&n);
    
    int ret = 1;
    while(n)//n不等于0
    {
        ret = ret * n;
        n--;
    }

    printf("结果为:%d\n",ret);
}

在这里插入图片描述

水仙花数
#include <stdio.h>

void main()
{
    int ge,shi,bai;//存放个位,十位,百位
    
    int i;
    for(i = 100; i <= 999; i++)//i从最小的三位数遍历到最大的三位数
    {
        /* 先计算个、十、百位*/
        ge = i%10;
        shi = i/10%10;
        bai = i/100%10;

        /* 判断是否是水仙花数 */
        if((ge*ge*ge)+(shi*shi*shi)+(bai*bai*bai) == i)
        {
            printf("%d ",i);
        }
    }
    puts("");
}

在这里插入图片描述

用*打印菱形
#include <stdio.h>
#include <math.h>

void main()
{
    int n = 5;//层数
    int i,j,k;

    for(i = -(n/2); i <= n/2; i++)//控制打印层数
    {
        for(k = 0; k < abs(i); k++)//控制打印空格数
        {
            printf(" ");
        }

        for(j = 0; j < n-2*abs(i); j++)//控制打印*数
        {
            printf("*");
        }

        puts("");//打印完一行换行
    }

}

在这里插入图片描述

数组逆序
#include <stdio.h>

void main()
{
    int arr[10];
    int i,j;
    //循环一次读如10个数据,空格隔开
    for(i = 0; i < 10; i++)
    {
        scanf("%d",&arr[i]);
    }

    //逆序前
    printf("Before reverse:");
    for(i = 0; i < 10; i++)
        printf("%2d ",arr[i]);
    puts("");

    /* 逆序 */
    i = 0;
    j = 9;
    int tmp;//中间变量,用于暂时保存数据
    while(i < j)
    {
        tmp = arr[j];
        arr[j] = arr[i];
        arr[i] = tmp;
        i++;
        j--;
    }

    //逆序后
    printf("After  reverse:");
    for(i = 0; i < 10; i++)
        printf("%2d ",arr[i]);
    puts("");
}

在这里插入图片描述

判断回文
#include <string.h>
#include <stdio.h>

void main()
{
    char buf[32] = {0};
    scanf("%s",buf);

    int l = 0;//指向字符串最左边字符
    int r = strlen(buf) - 1;//指向字符串最右边字符

    while(l < r)
    {
        if(buf[l] != buf[r])//不相等,打印,结束程序
        {
            printf("No!\n");
            return;
        }

        l++;
        r--;
    }

    printf("Yes!\n");//循环结束未发现不相等,则是回文
}

在这里插入图片描述

字符串排序
#include <string.h>
#include <stdio.h>

void main()
{
    char buf[32] = {0};
    //从键盘读取最多31个字符存入buf中
    fgets(buf,32,stdin);
    //将最后读入的字符'\n'变为'\0'
    buf[strlen(buf)-1] = '\0';

    int n = strlen(buf);
    int i,j;
    char tmp;
    
    //原字符串
    printf("Before: %s\n",buf);

    /* 冒泡排序 */
    for(i = 0; i < n-1; i++)//趟数
    {
        for(j = 0; j < n-i-1; j++)//每一趟比较次数
        {
            if(buf[j] > buf[j+1])
            {
                tmp = buf[j];
                buf[j] = buf[j+1];
                buf[j+1] = tmp;
            }
        }
    }

    //排序后
    printf("After : %s\n",buf);
}

在这里插入图片描述

删除字符串中的空格
#include <string.h>
#include <stdio.h>

void main()
{
    char buf[32] = {0};
    fgets(buf,32,stdin);
    buf[strlen(buf)-1] = '\0';

    int i,j;
    i = j =0;
    while(buf[j] != '\0')
    {
        while(buf[j] == ' ')//若有连续的空格
        {
            j++;
        }

        buf[i] = buf[j];
        i++;
        j++;
    }

    buf[i] = '\0';//后面的数据已经通过j赋值完毕,所以'\0'结束该字符串

    printf("After Delete: %s\n",buf);
}

在这里插入图片描述

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值