习题课:语言基础与控制结构

《计算机程序设计》

苏醒

计算机学院计算机研究所编译系统研究室

快递费用计算

编程实现

上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成5个区域。快递费按邮件重量计算,由起重费用、续重费用两部分构成:首重1公斤按起重资费计算,超过首重的重量按公斤收取续重费;

例如,寄往2区的快递重4公斤,其中起重资费14元,续重费为(4-1)*6=18元,合计快递费为32元。

0区 1区 2区 3区 4区
地区 上海 江、浙 京津冀豫皖陕鄂赣湘闽粤晋 黑吉辽川渝桂琼青甘宁云贵蒙 疆藏
首重价格 10 12 14 16 18
续重单价 2 4 6 8 10

快递费用计算

编程实现

  • 输入:一行输入用空格分隔的两个整数,第一个表示区域、第二个是重量
  • 输出:一行输出快递费用
快递费用计算
#include <iostream>
using namespace std;
int deliverFee(int area, int weight) {

}
int main() {
  int area, weight;
  cin >> area >> weight;
  cout << deliverFee(area, weight) << endl;
  return 0;
}
输入输出样例
2 4 # 输入
32  # 输出

快递费用计算

快递费用计算
int deliverFee(int area, int weight) {
  int firstFee = 0, continueFee = 0;
  switch (area) {
    case 0: firstFee = 10; continueFee = 2; break;
    case 1: firstFee = 12; continueFee = 4; break;
    case 2: firstFee = 14; continueFee = 6; break;
    case 3: firstFee = 16; continueFee = 8; break;
    case 4: firstFee = 18; continueFee = 10; break;
  }
  if (weight <= 1)
    return firstFee[area];
  else
    return firstFee[area] + (weight - 1) * continueFee[area];
}

快递费用计算

快递费用计算
int deliverFee(int area, int weight) {
  static const int firstFee[5] = {10, 12, 14, 16, 18};
  static const int continueFee[5] = {2, 4, 6, 8, 10};
  if (weight <= 1)
    return firstFee[area];
  else
    return firstFee[area] + (weight - 1) * continueFee[area];
}

交替数字和

编程实现

输入一个正整数nn中的每一位数字按下述规则分配一个符号:

  1. 最低位上的数字分配到正号;
  2. 剩余每位上数字的符号都与其相邻数字相反。

请补全calc(int n)函数的代码,按上面规则给正整数n的每位数字分配对应的正负号,然后返回所有数字之和。

例如,n为521时,(+5)+(-2)+(+1)=4,结果为4;n为1024时,因为(-1)+(+0)+(-2)+(+4)=1,结果为1。

交替数字之和
#include <iostream>
using namespace std;
int calc(int n) {

}
int main() {
  int n;
  cin >> n;
  cout << calc(n) << endl;
  return 0;
}
521  # 输入
4    # 输出

1024 # 输入
1    # 输出

交替数字之和

交替数字之和
int calc(int n) {
  int sum = 0, sign = 1;
  while (n > 0) {
    int digit = n % 10;  // 取出最低位数字
    sum += sign * digit; // 累加当前数字
    n /= 10;             // 右移一位
    sign = -sign;        // 符号交替
  }
  return sum;
}

考考你

更改题目要求,改为求偶数位数字平方奇数位数字立方的和,如何更改程序?

殆素数

编程实现

殆素数是素数因子个数(包括相同的与不同的)不超过某一固定常数的正整数。例如,15=3×5 有两个素因子,19只有一个素因子,27=3×3×3有三个素因子,所以它们都是素因子数不超过3的殆素数。 显然,当素因子个数为1时,殆素数就是素数。

在验证哥德巴赫猜想时,设N是偶数,虽然不能证明N是两个素数之和,但是可以证明它能够写成两个殆素数A和B的和,即N=A+B。其中A和B的素因子分别不超过a和b,这个情况可以用”a+b”来表示。 哥德巴赫猜想可写成”1+1”,我国数学家陈景润就成功证明了”1+2”成立。

请实现函数primeFactorCount(int n),计算n的素因子个数

殆素数
#include <iostream>
using namespace std;
bool isPrime(int n) {

}
int primeFactorCount(int n) {

}

int main() {
  int n;
  cin >> n;
  cout << primeFactorCount(n) << endl;
  return 0;
}
27 # 输入
3  # 输出

殆素数

殆素数
bool isPrime(int n) {
  for (int i = 2; i * i <= n; i++)
    if (n % i == 0)
      return false;
  return true;
}
int primeFactorCount(int n) {
  int count = 0;
  for (int i = 2; i <= n; i++) {
    if (n % i == 0 && isPrime(i)) {
      do {
        count++;
        n /= i;
      } while (n % i == 0);
    }
  }
  return count;
}

中位数

编程实现

中位数又称中值,是统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值。把一组数据按顺序排列之后,中位数是位于中间位置的数,注意中位数不是平均值

  • 如果数据有奇数个,就取最中间的那个数作为中位数,例如,对于 1、2、3、5、7,中位数是3。
  • 如果数据有偶数个,通常取最中间的两个数值的平均数作为中位数,例如,对于 1、2、4、6、7、10,中位数是(4+6)/2=5。

请实现函数median(double a[], int n),计算数组a的中位数。

中位数
#include <fstream>
using namespace std;
double median(double a[], int n) {

}
int main() {
  int n = 0;
  cin >> n;
  double a[n];
  for (int i = 0; i < n; i++)
    cin >> a[i];
  cout << median(a, n) << endl;
  return 0;
}

中位数

中位数
double median(double a[], int n) {
  // 排序
  for (int i = 0; i < n - 1; i++)
    for (int j = i + 1; j < n; j++)
      if (a[i] > a[j]) {
        double temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
  // 计算中位数
  if (n % 2 == 0)
    return (a[n / 2 - 1] + a[n / 2]) / 2;
  else
    return a[n / 2];
}

翻转课堂

序号 组别 组员 主题
1 22-1 陈靖豪,鹿飞祥,吴崔源,贾琳浩 VSCode快捷键
2 22-2 芦英豪,陈爔睿,甄曦,陈敬尧 5月8日
3 22-3 黄彬城,雷嘉,孙明辉,刘瑞 KMP算法
4 22-4 陈澍,徐弘仰,姚吉顺,何远超 5月8日
5 22-5 刘沛彧,杨勉,王震宇,苏新豪 Makefile
6 23-1 包恩龙,段立昊,车洲安,赵勇皓 实训讲解:猴子选大王
7 23-2 张远霖,李想,王振浩,刘鉴鉴 5月8日(晚)
8 23-3 卢绍良,任俊安,周林润,谷宝隆 string用法介绍
9 23-4 彭浩洋,周晟睿,徐子亮,蔡沂豆 与大模型的邂逅
10 23-5 郑特,王佳伟,任学斌,张凯博 5月8日(晚)
11 23-6 高小峰,张越,彭鑫茂,吕先启 5月13日
12 23-7 石正豪,宋崇辉,安子成,薛兆航 Makefile
13 23-8 王焕鑫,王康,吴兆琦,李邓朋 实训讲解:曲名排序
14 23-9 黄海涛,刘源,朱海,周舒 5月13日
15 23-10 王翔,翟腾宇,李嘉豪,李炘璘 5月15日
16 23-11 焦军洁,朱峻浩,何添龙,龙凌川 5月15日
17 23-12 刘芷辰,林子沣,雷振威 使用大模型解决程序设计问题
18 23-13 赵蕊,胡雅淑,李妍,江杨 二维数组索引的线性化

计算机程序设计