C语言思考题

上周五的C语言思考题

题目

求和:
(1) 1 + 1 3 + 1 5 + ⋯ 1+\dfrac13+\dfrac15+\cdots 1+31+51+

(2) 1 − 1 2 + 1 3 + ⋯ 1-\dfrac12 + \dfrac 13 + \cdots 121+31+

分析

这两个求和都是C语言中比较基础的(仅次于 1 + 2 + 3 + ⋯ 1+2+3+\cdots 1+2+3+ 1 + 1 2 + 1 3 ⋯ 1+\dfrac12+\dfrac13\cdots 1+21+31).编程题一般要求的都是给定的有限个求和,所以找出前 n n n项和的一般项公式是不必要的.计算机与数学不同(就目前的课程而言),一般要利用计算机敏与计算而不善变通的特点.所以,我们考虑最朴素的算法:没有到想要的项就一直加.

做这种求和题首先要找出可行的构造第 n n n项的方法.能以基础运算实现( + − × ÷ +-\times\div +×÷)为上,尽量不利用幂运算或其他运算.第一问的通项很容易找到,显然是 a n = 1 2 n − 1 a_n=\dfrac{1}{2n-1} an=2n11.而第二问则涉及奇偶,我们先写出其数学表达式 b n = ( − 1 ) n + 1 1 n b_n = (-1)^{n+1} \dfrac{1}{n} bn=(1)n+1n1.然后利用循环即可实现.

细节

我们在有些语言中,可以把 a i a_i ai这样的通项直接写成1/(2*i-1),但是在强类型的语言中(比如C)需要注意的是注意变量的类型.在操作中i我们一般以整型声明,因为浮点型可能会带来一系列的麻烦(比如精度等),而1/(2*i-1)是整型除以整型,最终的结果一定是整型,那么无论你输入多少最后的结果都会是1,因为只有第一项1/1时得到1,剩下的所有运算结果都会被从小数点截断变成0.
所以在这里我们必须进行强制类型转换,不建议对i转换,我们可以考虑对分子上的1进行转换,即(float)(1) / (2 * i - 1),这样i只有在参与运算时才是一个浮点型,而作为下标(循环指标)它一直是一个整型,这是非常优雅的.

另一个值得注意的细节就在于 b i b_i bi如何表示.如果一股脑地套用数学公式,用幂次来求符号是十分不划算的,因为首先stdio.h并不支持幂运算,加数学库徒增代码长度;其次,幂运算比基本的加减乘除要慢得多.要交替改变符号我们完全可以用一个变量symbol=1来专门储存符号(当然初始值的正负视情况而定),每一次运算改变一次就可以写成symbol*=-1.我特地写了一个程序来验证幂运算与交替改变符号的优劣,我们直接看结果,代码稍后附上.下面的结果中Time1是交替改变符号的耗时,Time2是幂运算的耗时,可以看到,在n100000000时运行耗时已经不在一个数量级上.

Please enter an integar n:
100000000
The sum is 0.693138.
Time1:0.277000
The sum is 0.693138.
Time2:9.219000

这其实不难理解,因为交替改变符号法为了得到正确的符号只进行了 n n n次乘法运算(即时间复杂度 O ( n ) O(n) O(n)),而幂运算法为了得到相同的效果要花费 ∑ i = 1 n ( i + 1 ) = n 2 + 3 n 2 \sum\limits_{i=1}^n(i+1)=\dfrac{n^2+3n}{2} i=1n(i+1)=2n2+3n次乘法(即时间复杂度 O ( n 2 ) O(n^2) O(n2)).

代码

问题一

int main(){
    //输入n
    int n;
    printf("Please enter an odd number n:\n");
    scanf("%d", &n);

    //判断n是否合法
    if( n%2 == 0 )
        {
            printf("Illega value!");
            return 0;
        }
    
    n = (n + 1) / 2;//把n从值转为下标

        //利用while循环计算
        int i = 0;
        float sum = 0;
        while (i < n)
        {
            i++;
            sum += (float)(1) / (2 * i - 1);//将1强制类型转换避免i的转换
        }
    
    printf("The sum is %f.\n", sum);

    return 0;
}

问题2

#include <stdio.h>

int main(){
    //输入n
    int n;
    printf("Please enter an integar n:\n");
    scanf("%d", &n);

    int i = 0;
    float sum = 0;
    int symbol = -1;
    while (i<n)
    {
        i++;
        symbol *= (-1);//交替改变符号
        sum += symbol*((float)(1) / i);//对常量进行强制类型转换
    }

    printf("The sum is %f.\n", sum);

    return 0;
}

程序计时

#include <stdio.h>
#include <math.h>
#include <time.h>

int main(){
    int n;
    printf("Please enter an integar n:\n");
    scanf("%d", &n);

    clock_t start, end;
    double duration;

    start = clock();

    int i = 0;
    float sum = 0;
    int symbol = -1;
    while (i<n)
    {
        i++;
        symbol *= (-1);//交替改变符号
        sum += symbol*((float)(1) / i);
    }

    printf("The sum is %f.\n", sum);
    end = clock();
    duration = (double)(end - start) / CLOCKS_PER_SEC;
    printf("Time1:%lf\n", duration);

    start = clock();
    
    i = 0;
    sum = 0.0;
    while (i<n)
    {
        i++;
        sum += pow(-1,i+1)*((float)(1) / i);//幂运算
    }
    printf("The sum is %f.\n", sum);
    end = clock();
    duration = (double)(end - start) / CLOCKS_PER_SEC;
    printf("Time2:%lf\n", duration);

    return 0;
}

其中time.h就是用来实现计时功能的库文件,有兴趣的读者可以参考上述代码给自己的程序计时.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 菜鸟网站是一个提供编程学习资源的网站,其中包括了很多编程语言的学习资料和练习题。C语言是一种广泛应用于编程领域的编程语言,对于初学者来说,掌握C语言是一个很好的起点。 要下载C语言100题,首先需要访问菜鸟网站的官方网址。在网站的搜索框中输入"C语言100题"关键词,点击搜索后,将会列出相关的学习资源。 在搜索结果中,找到与C语言100题相关的学习资料或练习题,点击进入该页面。在页面上会显示相关练习题的题目和要求。 接下来,根据页面上的提示,可以选择进行在线练习,或者下载练习题到本地进行练习。一般来说,网站会提供相关练习题的下载链接,点击链接即可下载到本地。 下载完成后,可以使用任何适合编写C语言代码的文本编辑器,打开下载的练习题文件。逐一阅读每个题目,思考并编写对应的C语言代码。 完成练习题后,可以将代码保存并运行调试,查看是否得到正确的结果。如果遇到问题,可以在菜鸟网站的论坛上提问,或者参考其他学习资料进行理解和修正。 通过下载C语言100题进行练习,可以帮助初学者巩固和提升对C语言的理解和掌握。练习不仅可以帮助学习者熟悉C语言的语法和应用,同时也可以提高编程思维和解决问题的能力。最终,学习者可以通过多次练习和实践,逐渐掌握C语言编程的技巧和方法,成为一名合格的程序员。 ### 回答2: 要下载C语言100题,你可以去"菜鸟教程"的网站上查找和下载。菜鸟教程是一个非常有用的学习编程的网站,提供了各种编程语言的教程、学习资源和在线编译器。在该网站上,你可以找到C语言的教程和实践项目。要下载C语言100题,你可以按照以下步骤进行操作: 1. 打开浏览器,输入"菜鸟教程"的网址(www.runoob.com)。 2. 在网站的搜索框中输入"C语言100题",点击搜索。 3. 在搜索结果中选择适合你需要的项目链接,比如"C语言100题"。 4. 进入项目页面后,你可能需要注册一个账号才能下载资源。按照网站的提示进行注册。 5. 一旦注册完成并登录账号,你将能够访问并下载C语言100题的相关资源。 请注意,下载资源前要确保你的计算机上已经安装了C语言的编译器,比如GCC(GNU编译器集合)。这样才能在本地运行和测试C语言的代码。此外,下载资源后,你可以在一个集成开发环境(IDE)中打开题目代码并进行修改和编译。一些常用的IDE包括Code::Blocks、Dev-C++和Visual Studio等。 希望上述解答对你有帮助。如果还有其他问题或疑问,请随时向我提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值