C语言经典题目(七)

简介: C语言经典题目(七)

31.打印100~200之间的素数

素数:即质数,除了1和自己之外,再没有其他的约数,则该数据为素数

方法一:试除法

缺陷:超过i一半的数据,肯定不是i的倍数,该方法进行了许多没有意义的运算
#include<stdio.h>
int main()
{
    int i = 0;
    int count = 0;
    // 外层循环用来获取100~200之间的所有数据,100肯定不是素数,因此i从101开始
    for(i=101; i<=200; i++)
    {
        //判断i是否为素数:用[2, i)之间的每个数据去被i除,只要有一个可以被整除,则不是素数
        int j = 0;
        for(j=2; j<i; j++)
        {
            if(i%j == 0)
            {
                break;
            }
        }
 // 上述循环结束之后,如果j和i相等,说明[2, i)之间的所有数据都不能被i整除,则i为素数
        if(j==i)
        {
            count++;
            printf("%d ", i);
        }
    }
 
 
    printf("\ncount = %d\n", count);
    return 0;
}
 

方法二:

每拿到一个数据,只需要检测其:[2, i/2]区间内是否有元素可以被2i整除即可,可以说明i不是素数
#include<stdio.h>
int main()
{
    int i = 0;//
    int count = 0;
    for(i=101; i<=200; i++)
    {
        //判断i是否为素数
        //2->i-1
        int j = 0;
        for(j=2; j<=i/2; j++)
        {
            if(i%j == 0)
            {
                break;
            }
        }
        if(j>i/2)
        {
            count++;
            printf("%d ", i);
        }
    }
    printf("\ncount = %d\n", count);
    return 0;
}

方法三:

如果i能够被[2, sqrt(i)]之间的任意数据整除,则i不是素数。
原因:如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于sqrt(m),另一个大于或等于 sqrt(m)。
#include<stdio.h>
int main()
{
    int i = 0;
    int count = 0;
    for(i=101; i<=200; i++)
    {
        //判断i是否为素数
        //2->i-1
        int j = 0;
        for(j=2; j<=sqrt(i); j++)
        {
            if(i%j == 0)
            {
                break;
            }
        }
        //...
        if(j>sqrt(i))
        {
            count++;
            printf("%d ", i);
        }
    }
    printf("\ncount = %d\n", count);
    return 0;
}

方法四:

只要i不被[2, sqrt(i)]之间的任何数据整除,则i是素数,但是实际在操作时i不用从101逐渐递增到200,因为出了2和3之外,不会有两个连续相邻的数据同时为素数
#include<stdio.h>
int main()
{
    int i = 0;
    int count = 0;
    for(i=101; i<=200; i+=2)
    {
        //判断i是否为素数
        //2->i-1
        int j = 0;
        for(j=2; j<=sqrt(i); j++)
        {
            if(i%j == 0)
            {
                break;
            }
        }
        if(j>sqrt(i))
        {
            count++;
            printf("%d ", i);
        }
    }
    printf("\ncount = %d\n", count);
    return 0;
}

32.给定两个数,求这两个数的最大公约数

在这里插入图片描述
方法一:暴力穷举法

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    int ret = 0;//设最大公约数为ret
    if (a > b)
    {
        ret = b;
    }
    else
    {
        ret = a;
    }
    while (1)
    {
        if (a % ret == 0 && b % ret == 0)
        {
            break;
        }
        //若ret不能整除a和b,那么ret就自减1,慢慢试,直到满足
        ret--;
    }
    printf("%d\n", ret);
    return 0;
}

方法二:辗转相除法

例:18和24的最大公约数
第一次:a = 18 b = 24 c = a%b = 18%24 = 18
  循环中:a = 24   b=18

第二次:a = 24 b = 18 c = a%b = 24%18 = 6

  循环中:a = 18   b = 6

第三次:a = 18 b = 6 c=a%b = 18%6 = 0
循环结束
此时b中的内容即为两个数中的最大公约数。

#include<stdio.h>
int main()
{
    int a = 18;
    int b = 24;
    int c = 0;
 
    while(c=a%b)
    {
        a = b;
        b = c;
    }
    printf("%d\n", b);
    return 0;
}

33.计算1!+2!+.....+n!

#include<stdio.h>
int main()
{
    int i, j,n;
    int sum = 0;
    int ret = 1;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        ret = ret * i;//前面的阶乘乘以后面的数,就是后面数的阶乘。
        sum = sum + ret;
    }
    printf("%d\n", sum);
    return 0;
}

34.在一个有序数组中查找某个具体的数字n(二分查找法)

例如:在1 2 3 4 5 6 7 8 9 10中找到的某数位置
输入:7
输出:7的数组下表为:6

以在升序序列中查找目标元素为例,二分查找算法的实现思路是:
1.初始状态下,将整个序列作为搜索区域(假设为 [B, E]);
2.找到搜索区域内的中间元素(假设所在位置为 M),和目标元素进行比对。如果相等,则搜索成功;如果中间元素大于目标元素,表明目标元素位于中间元素的左侧,将 [B, M-1] 作为新的搜素区域;反之,若中间元素小于目标元素,表明目标元素位于中间元素的右侧,将 [M+1, E] 作为新的搜素区域;
3.重复执行第二步,直至找到目标元素。如果搜索区域无法再缩小,且区域内不包含任何元素,表明整个序列中没有目标元素,查找失败。
#include<stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);//数组的个数
    int lift = 0;
    int right = sz - 1;
    int k;
    printf("输入你需要查找的数:");
    scanf("%d", &k);
    while (lift <= right)
    {
        int mid = (lift + right) / 2;//求中值
        //int mid = lift + (right-lift)/2
        //这样防止lift+right的值越界,导致数值丢失
        if (arr[mid] < k)
            lift = mid + 1;
        else if (arr[mid] > k)
            right = mid - 1;
        else
        {
            printf("%d的数组下标是:%d", k, mid);
            break;
        }
    }
    if (lift > right)
        printf("%d找不到!", k);
    return 0;
}

35.演示多个字符从两端移动到中间

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<Windows.h>
int main()
{
    char ch1[] = "I Love you";
    char ch2[] = "##########";
    int lift = 0;
    int right = strlen(ch1) - 1;
    while (lift <= right)
    {
        ch2[lift] = ch1[lift];
        ch2[right] = ch1[right];
        lift++;
        right--;
        printf("%s\n", ch2);
        Sleep(1000);
    }
    return 0;
}
相关文章
|
6月前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
6月前
|
存储 C语言 C++
C语言------------指针笔试题目深度剖析
C语言------------指针笔试题目深度剖析
47 1
|
11月前
2.C语言题目---字符串左旋
2.C语言题目---字符串左旋
77 1
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
11月前
|
存储
1.C语言题目---指针类(基础)
1.C语言题目---指针类(基础)
60 1
|
3月前
|
存储 编译器 C语言
【C语言】指针练习题目
【C语言】指针练习题目
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
46 1
|
6月前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
5月前
|
C语言
c语言循环题目
c语言循环题目
|
6月前
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)