0
点赞
收藏
分享

微信扫一扫

2022春 南哪大学 程序设计基础 OJ答案参考(2)

Problem 1 调和级数

描述

在数学中,有一种调和级数的神奇存在,如下公式,它的名字源于泛音或音乐中泛音的概念(感兴趣的请自行上网搜索)

1+12+13+⋯+1i+⋯=∑∞i=11i

现在,小吴同学想知道调和级数的前n项和是多少,请你设计程序帮他计算一下结果,结果小数点后四舍五入保留6位小数

输入

第一行,一个正整数n,表示调和级数要计算前n项,1<=n<1000

输出

一行,表示调和级数计算的结果,四舍五入保留小数点后6位小数

示例

  • 输入:

      3
  • 输出:

      1.833333
  • 解释:

      1+1/2+1/3=1.833333

注意

  • 请不要有多余的输入或输出(例如提示、调试信息)
  • 提交时记得去除程序末尾为暂停程序而临时使用的输入语句
    • cin.get();
    • getchar();
    • system("pause");
    • ...
  • 如果用到了scanf_s(...)这类vs特有的_s函数,提交时需还原为标准函数

参考代码:

(无注释版见文末)

//计算调和级数 并保留六位小数 

#include <stdio.h>

int main()
{
    int n;
    scanf( "%d", &n );            //读取n 
    
    int i;
    double sum = 0.0;            //初始化i和sum 
    for (i = 1; i <= n; i++) {      //为计数控制循环,使用for循环求和 
        sum += 1/(1.0*i);
    }

    printf("%.6f", sum);          //输出 
    
    return  0;
}

Problem 2 进制转换

描述

进制,也即进位计数制,是一种人为定义的带进位的计数方法。以我们习惯的十进制为例,它每逢十便进一位。但在计算机世界中,数字实际上是用二进制来表示的,也就是每逢二便进一位。为了方便理解,你可以观察如下表格寻找规律:

二进制十进制
00
11
102
113
1004
1015
1106
1117
10008
10019
101010
101111
......

小吴同学非常苦恼,因为他发现通过查表来找到每个二进制数对应的十进制数是不现实的。不知道你能不能帮他设计一个程序,把任意一个二进制数转换为对应的十进制数呢?

输入

第一行,一个完全由0、1组成的正整数n,表示待转换的二进制数,n的位数不超过10位。

输出

一行,表示n对应的十进制数。

示例1

  • 输入:

      10
  • 输出:

      2
  • 解释:

      1*2^1+0*2^0=2

示例2

  • 输入:

      0110
  • 输出:

      6
  • 解释:

      1*2^2+1*2^1+0*2^0=6

注意

  • 请不要有多余的输入或输出(例如提示、调试信息)
  • 提交时记得去除程序末尾为暂停程序而临时使用的输入语句
    • cin.get();
    • getchar();
    • system("pause");
    • ...
  • 如果用到了scanf_s(...)这类vs特有的_s函数,提交时需还原为标准函数

参考代码:

(无注释版见文末)

// 二进制转十进制

#include<stdio.h>
#include<math.h>                 // 按所给提示,需使用pow()函数计算2^n次方,故引入该头文件

int main()
{
    int n;
    scanf( "%d", &n );               // 读取n 
    
    int i=0;
    int sum=0;
    int m;                                    // 初始化i,sum,m
    while( n!= 0 ){                      // while循环判断条件为n是否为0
        m = n;                               // 将n赋值给m,此处赋值需再循环内进行,否则m在第二轮循环对10取余后结果必为0
        n /= 10;                              // n整除10(相当于删去最后一位),   如n=110→11→1→0
        m %= 10;                           // m对10取余,得出2^i项的系数,如对n=110有0→1→1
        sum += m*pow( 2, i );      // 将 m*2^i 加和,如对n=110,有0*2^0+1*2^1+2*2^2
        i++;                                    // 随位数增加增大指数
    }
    
    printf( "%d", sum );             // 输出结果

    return 0;
}

无注释版:

problem1:

#include <stdio.h>

int main()
{
    int n;
    scanf( "%d", &n );
    
    double sum = 0.0;
    int i;
    for (i = 1; i <= n; i++) {
        sum += 1/(1.0*i);
    }

    printf("%.6f", sum);
    
    return  0;
}
 

problem2:

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

int main()
{
    int n;
    scanf( "%d", &n );
    
    int i=0;
    int sum=0;
    int m;
    while( n!= 0 ){
        m = n;
        n /= 10;
        m %= 10; 
        sum += m*pow( 2, i );
        i++;
    }
    
    printf( "%d", sum );

    return 0;
}

声明:

本专栏为2022春 南哪大学 程序设计基础 课程作业,答案为po主本人初次提交时所写,OJ判定满分,但非老师给出的参考答案,侵删。

本次为优化阅读体验,给出注释。有问题可在评论区写出,有空会解答或另写补充。

举报

相关推荐

0 条评论