初阶编程题积累(1)------[C语言]

文章介绍了三种不同的算法来计算两个正整数的最小公倍数,包括基础的试除法、优化的乘法法以及利用辗转相除法求解。此外,还提供了一个解决方案来倒置字符串中的单词顺序,同时保持标点符号的位置不变。这些方法展示了基础的编程技巧和问题解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、求最小公倍数

题目描述

正整数A和正整数B的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的的最小公倍数。

输入描述

输入两个正整数A和B。

输出描述

输出A和B的最小公倍数。

示例

输入:
5 7
输出:
35

第一种解法

#include <stdio.h>
int main()
{
    int a, b = 0;
    scanf("%d %d", &a, &b);
    int n = a > b ? a : b;
    while (1)
    {
        if ((n % a) == 0 && (n % b) == 0)
            break;
        n++;
    }
    printf("%d\n", n);
    return 0;
}

这种算法耗时较长,效率较低。但是思路是最简单和基础的,其思路是先找出A和B中的最大值,然后以这个最大值为基础,一个一个去试除A和B,当同时能够整除A和B时即为A和B的最大公倍数。

运行时间1001ms
占用内存476KB

第二种解法

#include <stdio.h>
int main()
{
    int a, b, i = 1;
    scanf("%d %d", &a, &b);
    while (1)
    {
        if ((a * i) % b == 0)
            break;
        i++;
    }
    printf("%d\n", a * i);
    return 0;
}

第二种算法相比第一种会快很多,用乘法的方式使得循环的次数少了很多

运行时间3ms
占用内存400KB

第三种解法

#include <stdio.h>
int gcd(int a, int b)
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d\n", a / gcd(a, b) * b);
    return 0;
}

这种算法利用了辗转相除法,先求出最大公约数,再求出最小公倍数。

最小公倍数=两个数的乘积/最大公约数

为防止溢出,(a*b)/m改为(a/m)*b --m为最大公约数

运行时间4ms
占用内存348KB

二、倒置字符串

题目描述

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

输入描述

每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100

输出描述

依次输出倒置之后的字符串,以空格分割

示例

输入:
I like beijing.

输出:
beijing. like I

解法

#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
    while (left < right)
    {
        char tmp = 0; 
        tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[100] = { 0 };
    gets(arr);
    int len = strlen(arr);
    reverse(arr, arr + len - 1);//将整个字符串翻转,即全部倒序排放
    char* start = arr;//再将每个单词翻转为正序
    while (*start)
    {
        char* end = start;
        while (*end != ' ' && *end != '\0')
            end++;
        reverse(start, end - 1);
        if (*end == ' ')
            start = end + 1;
        else
            start = end;
    }
    printf("%s\n", arr);
    return 0;
}

一道很经典的题目,定义字符串倒置函数,先翻转整个字符串一次,再逐个将单词翻转一次。

运行时间2ms
占用内存308KB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值