C语言经典题目(一)


分享之前和大家分享一本书叫做《厚黑学》,这本书可以了解一下社会现实,但是看这本书的时候切记,不可迷失自己。扉页的第一段话和大家分享一下:我自读书识字以来,就想为英雄豪杰,求之四书五经,茫无所得,求之诸子百家,与夫廿十四史,仍无所得,以为古之为英雄者,必有不传之秘,不过吾人生性愚鲁,寻他不出罢了。穷索冥搜,忘寝废食,如是者有年,一日偶然想起三国时几个人物,不觉恍然大悟曰:得之矣,得之矣,古之为英雄豪杰者,不过面厚心黑而已。这本书很好的,哈哈哈博主会努力这几天看完滴

今天给大家分享的是C语言经典题目(一)包含原题以及变式题目,非常值得深思和学习的题目。

一.将字符转化为 ASCII 码

ASCII表格

ASCII表格

1.普通转换

#include <stdio.h>
int main()
{
    char c;
    printf("输入一个字符: ");
 
    // 读取用户输入
    scanf("%c", &c);  
    
    // %d 显示整数
    // %c 显示对应字符
    printf("%c 的 ASCII 为 %d", c, c);
    return 0;
}

输出结果如下:

//输入一个字符: a
//a 的 ASCII 为 97

2.一次读取长字符,并一个一个显示 ASCII 码:

#include <stdio.h>
#define MAX 65535 // 最大字符串长度
 
int main()
{
  char s[MAX];
  printf("请输入长度小于 %d 的任意字符:",MAX);
  scanf("%s",s);    // 读取字符串。
  for(int i = 0; s[i]!; i++)
  {
    printf("%c的ASCII:%d\t",s[i],s[i]);
  }
}

3.ASCII与字符的相互转换

#include <stdio.h>
#define MAX_ASCII 127
 
int main()
{
    char num,enter;
    int temp=1;
    for(;temp>0;)
    {
        printf("----------------------------\n");
        printf("|**      开始            **|\n");
        printf("|**ASCII  转  字符  按:1 **|\n");
        printf("|**字符   转  ASCII 按:2 **|\n");
        printf("|**      结束       按:0 **|\n");
        printf("----------------------------\n");
        scanf("%d",&temp);
        if(temp==1)
        {
            printf("请输入数值小于 %d 的任意字符:",MAX_ASCII);
            scanf("%d",&num);
            printf("ASCII为 %d ,对应的字符为 %c \n",num,num);
        }
        if(temp==2)
        {
            printf("输入一个字符: \n");     
            scanf("%c", &enter);      //回车键也算字符,所以这里使用其他变量替之.
            scanf("%c", &num);  
            printf("     %c 的 ASCII 为 %d    \n", num, num);
        }
    }
    return 0;
}

二.计算字节大小

使用 sizeof 操作符计算int, float, double 和 char四种变量字节大小

需要注意以下两点:

1)sizeof 是 C 语言的一种单目操作符,如C语言的其他操作符++、--等,它并不是函数;

2) sizeof 操作符以字节形式给出了其操作数的存储大小;

1.计算 int, float, double 和 char 字节大小 :

#include <stdio.h>
 
int main()
{
    int integerType;
    float floatType;
    double doubleType;
    char charType;
 
    // sizeof 操作符用于计算变量的字节大小
    printf("Size of int: %ld bytes\n",sizeof(integerType));
    printf("Size of float: %ld bytes\n",sizeof(floatType));
    printf("Size of double: %ld bytes\n",sizeof(doubleType));
    printf("Size of char: %ld byte\n",sizeof(charType));
 
    return 0;
}

输出结果如下:

Size of int: 4 bytes
Size of float: 4 bytes
Size of double: 8 bytes
Size of char: 1 byte

2.计算 long long, long double 字节大小:

#include <stdio.h>
int main()
{
    int a;
    long b;
    long long c;
 
    double e;
    long double f;
 
 
    printf("Size of int = %ld bytes \n", sizeof(a));
    printf("Size of long = %ld bytes\n", sizeof(b));
    printf("Size of long long = %ld bytes\n", sizeof(c));
 
    printf("Size of double = %ld bytes\n", sizeof(e));
    printf("Size of long double = %ld bytes\n", sizeof(f));
 
    return 0;
}

输出结果如下:

Size of int = 4 bytes 
Size of long = 8 bytes
Size of long long = 8 bytes
Size of double = 8 bytes
Size of long double = 16 bytes

三.判断三个数中的最大数

1.普通方法:

#include <stdio.h>
 
int main()
{
    double n1, n2, n3;
 
    printf("请输入三个数,以空格分隔: ");
    scanf("%lf %lf %lf", &n1, &n2, &n3);
 
    if( n1>=n2 && n1>=n3 )
        printf("%.2f 是最大数。", n1);
 
    if( n2>=n1 && n2>=n3 )
        printf("%.2f 是最大数。", n2);
 
    if( n3>=n1 && n3>=n2 )
        printf("%.2f 是最大数。", n3);
 
    return 0;
}

输出结果如下:

请输入三个数,以空格分隔: 1 2 3
3.00 是最大数。

2.巧妙利用if—else语句

#include<stdio.h>
 
int main()
{
    int a,b,c,max;
    printf("请输入三个数,用空格隔开:");
    scanf("%d %d %d",&a,&b,&c);
    if(a>b){
        max=a;
    } else {
        max=b;
    }
    if(max>c){
        printf("最大值是%d",max);
    } else{
        max=c;
        printf("最大值是%d",max);
    }
    return 0;
}

3.运用三元表达式

#include <stdio.h>
 
int main()
{
  int a, b, c, max;
  printf("请输入三个数,用空格分割: ");
  scanf("%d %d %d", &a, &b, &c);
  max =  a > b ? ( a > c ? a : c ) : ( b  > c ? b : c);
  printf("最大值是:%d", max);
  return 0;
}

四.判断是否是闰年

    • 普通方法(直接判断)

#include <stdio.h>
 
int main()
{
    int year;
    printf("输入年份: ");
    scanf("%d",&year);
    // year = 400;
 
    // (四年一闰,百年不闰) || 四百年在闰年
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)    
    {
        printf("y\n");
    }
    else
    {
        printf("n\n");
    }
 
    return 0;
}

2.多重if-else语句

#include <stdio.h>
 
int main()
{
    int year;
 
    printf("输入年份: ");
    scanf("%d",&year);
 
    if(year%4 == 0)
    {
        if( year%100 == 0)
        {
            // 这里如果被 400 整数是闰年
            if ( year%400 == 0)
                printf("%d 是闰年", year);
            else
                printf("%d 不是闰年", year);
        }
        else
            printf("%d 是闰年", year );
    }
    else
        printf("%d 不是闰年", year);
    
    return 0;
}

五.计算自然数之和

1.使用for循环

#include <stdio.h>
int main()
{
    int n, i, sum = 0;
    
    printf("输入一个正整数: ");
    scanf("%d",&n);
 
    for(i=1; i <= n; ++i)
    {
        sum += i;   // sum = sum+i;
    }
 
    printf("Sum = %d",sum);
 
    return 0;
}

2.使用while循环

#include <stdio.h>
int main()
{
    int n, i, sum = 0;
    
    printf("输入一个正整数: ");
    scanf("%d",&n);
 
    i = 1;
    while ( i <=n )
    {
        sum += i;
        ++i;
    }
 
    printf("Sum = %d",sum);
 
    return 0;
}

3.使用递归

#include <stdio.h>
int addNumbers(int n);
 
int main()
{
    int num;
    printf("输入一个整数: ");
    scanf("%d", &num);
    printf("Sum = %d",addNumbers(num));
    return 0;
}
 
int addNumbers(int n)
{
    if(n != 0)
        return n + addNumbers(n-1);
    else
        return n;
}

4.利用等差数列求和公式

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个自然数:");
    while (scanf("%d", &num) == 1)
    {
        printf("Sum = %d", (num + 1) * num / 2);
        break;
    }
    return 0;
}

六.输出九九乘法表格

1.利用for循环

#include<stdio.h> 
 
int main(){  
    //外层循环变量,控制行  
    int i = 0;  
    //内层循环变量,控制列   
    int j = 0;   
    for(i=1;i<=9;i++){  
        for(j=1;j<=i;j++){  
            printf("%dx%d=%d\t",j,i,i*j);  
        }  
        //每行输出完后换行   
        printf("\n");     
    }  
}

输出结果如下:

1x1=1    
1x2=2    2x2=4    
1x3=3    2x3=6    3x3=9    
1x4=4    2x4=8    3x4=12    4x4=16    
1x5=5    2x5=10    3x5=15    4x5=20    5x5=25    
1x6=6    2x6=12    3x6=18    4x6=24    5x6=30    6x6=36    
1x7=7    2x7=14    3x7=21    4x7=28    5x7=35    6x7=42    7x7=49    
1x8=8    2x8=16    3x8=24    4x8=32    5x8=40    6x8=48    7x8=56    8x8=64    
1x9=9    2x9=18    3x9=27    4x9=36    5x9=45    6x9=54    7x9=63    8x9=72    9x9=81    

2.递归实现方式

#include <stdio.h>
 
void func(int i, int j)
{
    if(i>j)
        return;
    printf("%dx%d=%d\t", i, j, i*j);
    func(i+1, j);
}
 
void f(int n)
{
    if(n==1)
        printf("1x1=1\n");
    else
    {
        f(n-1);
        func(1, n);
        putchar('\n');
    }
}
 
 
int main()
{
    f(9);
    return 0;
}

七.斐波那契数列

斐波那契数列定义:

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........这个数列从第3项开始,每一项都等于前两项之和。

1.输出指定数量的斐波那契数列

#include <stdio.h>
 
int main()
{
    int i, n, t1 = 0, t2 = 1, nextTerm;
 
    printf("输出几项: ");
    scanf("%d", &n);
 
    printf("斐波那契数列: ");
 
    for (i = 1; i <= n; ++i)
    {
        printf("%d, ", t1);
        nextTerm = t1 + t2;
        t1 = t2;
        t2 = nextTerm;
    }
    return 0;
}

输出结果如下:

输出几项: 10
斐波那契数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

2.输出指定数字前的斐波那契数列

#include <stdio.h>
 
int main()
{
    int t1 = 0, t2 = 1, nextTerm = 0, n;
 
    printf("输入一个正数: ");
    scanf("%d", &n);
 
    // 显示前两项
    printf("斐波那契数列: %d, %d, ", t1, t2);
 
    nextTerm = t1 + t2;
 
    while(nextTerm <= n)
    {
        printf("%d, ",nextTerm);
        t1 = t2;
        t2 = nextTerm;
        nextTerm = t1 + t2;
    }
    
    return 0;
}

输出结果如下:

输入一个正数: 100
斐波那契数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,

八.求两个数的最大公约数

1.使用for和if

#include <stdio.h>
 
int main()
{
    int n1, n2, i, gcd;
 
    printf("输入两个正整数,以空格分隔: ");
    scanf("%d %d", &n1, &n2);
 
    for(i=1; i <= n1 && i <= n2; ++i)
    {
        // 判断 i 是否为最大公约数
        if(n1%i==0 && n2%i==0)
            gcd = i;
    }
 
    printf("%d 和 %d 的最大公约数是 %d", n1, n2, gcd);
 
    return 0;
}

输出结果如下:

输入两个正整数,以空格分隔: 81 153
81 和 153 的最大公约数是 9

2.使用while和if

#include <stdio.h>
int main()
{
    int n1, n2;
    
    printf("输入两个数,以空格分隔: ");
    scanf("%d %d",&n1,&n2);
 
    while(n1!=n2)
    {
        if(n1 > n2)
            n1 -= n2;
        else
            n2 -= n1;
    }
    printf("GCD = %d",n1);
 
    return 0;
}

3.使用递归

#include <stdio.h>
int hcf(int n1, int n2);
int main()
{
   int n1, n2;
   printf("输入两个正整数: ");
   scanf("%d %d", &n1, &n2);
 
   printf("%d 和 %d 的最大公约数为 %d", n1, n2, hcf(n1,n2));
   return 0;
}
 
int hcf(int n1, int n2)
{
    if (n2 != 0)
       return hcf(n2, n1%n2);
    else 
       return n1;
}

4.使用辗转相除法

#include <stdio.h>
 
int main()
{
    int a,b;
    int t;
    scanf("%d %d", &a, &b);
    while (b !=0 ){
        t = a%b;
        a = b;
        b = t;
        printf("a=%d b=%d t=%d\n",a , b, t);
    }
    printf("最大公约数是%d\n", a);
    return 0;
}

九.求两数的最小公倍数

1.使用while和if

#include <stdio.h>
 
int main()
{
    int n1, n2, minMultiple;
    printf("输入两个正整数: ");
    scanf("%d %d", &n1, &n2);
 
    // 判断两数较大的值,并赋值给 minMultiple
    minMultiple = (n1>n2) ? n1 : n2;
 
    // 条件为 true
    while(1)
    {
        if( minMultiple%n1==0 && minMultiple%n2==0 )
        {
            printf("%d 和 %d 的最小公倍数为 %d", n1, n2,minMultiple);
            break;
        }
        ++minMultiple;
    }
    return 0;
}

输出结果如下:

输入两个正整数: 72 120
72 和 120 的最小公倍数为 360

2.通过最大公约数计算

ps:(两个数相乘,再除以最大公倍数结果是最小公倍数数)

#include <stdio.h>
 
int main()
{
    int n1, n2, i, gcd, lcm;
 
    printf("输入两个正整数: ");
    scanf("%d %d",&n1,&n2);
 
    for(i=1; i <= n1 && i <= n2; ++i)
    {
        // 判断最大公约数
        if(n1%i==0 && n2%i==0)
            gcd = i;
    }
 
    lcm = (n1*n2)/gcd;
    printf("%d 和 %d 的最小公倍数为 %d", n1, n2, lcm);
 
    return 0;
}

输出结果如下:

输入两个正整数: 72 120
72 和 120 的最小公倍数为 360

十.计算阶乘

一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

1.普通方法

#include <stdio.h>
 
int main()
{
    int n, i;
    unsigned long long factorial = 1;
 
    printf("输入一个整数: ");
    scanf("%d",&n);
 
    // 如果输入是负数,显示错误
    if (n < 0)
        printf("Error! 负数没有阶乘jiechen");
 
    else
    {
        for(i=1; i<=n; ++i)
        {
            factorial *= i;              // factorial = factorial*i;
        }
        printf("%d! = %llu", n, factorial);
    }
 
    return 0;
}

2.使用递归

#include <stdio.h>
long int multiplyNumbers(int n);
 
int main()
{
    int n;
    printf("输入一个整数: ");
    scanf("%d", &n);
    printf("%d! = %ld", n, multiplyNumbers(n));
    return 0;
}
long int multiplyNumbers(int n)
{
    if (n >= 1)
        return n*multiplyNumbers(n-1);
    else
        return 1;
}

2023.01.30

From:努力进大厂的新青年

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力进大厂的新青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值