2016级计算机C++助教工作(12) 第二次上机解题报告

C++助教工作解析:上机解题报告
这篇博客记录了2016级计算机C++助教的第二次上机解题情况,涉及五道题目:Brainman(冒泡排序)、Eazzzzzy、Primary Arithmetic、Binary Numbers和Digital Roots。通过对这些编程问题的解答,助教提供了详细的解题思路和步骤。

A.   Brainman

冒泡排序,平方的复杂度能过,循环N次,每次判断相邻两个数是否要交换,统计次数即可

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int num[1001];

int main(){
	int t,n;
	cin>>t;
	for(int tt = 1; tt <= t; tt++){
		cin>>n;
                 
		for(int i = 0;i < n; i++){
			cin>>num[i];
		}
		int ans = 0;
		for(int i = 0;i < n; i++){
			for(int j = 0;j < n -1 ; j++){
				if(num[j] > num[j+1]){
					swap(num[j],num[j+1]);
					ans++;
				}
			}
		}
		printf("Scenario #%d:\n",tt);
		cout<<ans<<endl<<endl;
	}
	return 0;
}

B.

Windowsredstone 是程设助教! 一天上机赛,他正在偷窥同学的程序。只见同学写下了代码: int a[100000000000]; 面对这位同学想要声明一个 400GB 数组的意图,他当场没绷住。 现在,有 T 个这样的声明,他想问你对于每个声明,占用的内存空间是多大? 输入 第一个数为数据组数 T 。 接下来 T 行,每行一个字符串表示声明。 保证声明一定是 {类型} {名称}[{长度}]; 的格式,且没有多余的空格。 具体而言,一个数组声明由类型、名称、长度组成。 类型只可能是 char(1B ), short(2B ), int(4B ), long long(8B ) 中的一种。 名称只可能是由大小写字母、数字和下划线组成的字符串,并且开头字符一定是字母,长度在范围 [1,50] 内。 长度只可能是正整数,且在范围 [1,109] 内。 输出 对于每组数据,输出一行表示占用空间,以指定单位格式输出。 输出格式为 ({g}GB )({m}MB )({k}KB )({b}B),参见输出样例获得更好地理解。 严格表述格式: 如果占用空间为 s ,定义合法的拆分 (g,m,k,b):230g+220m+210k+b=s 当且仅当 m,k,b∈[0,1024) 。 若 g>0 ,输出 {g}GB; 若 m>0 ,输出 {m}MB; 若 k>0 ,输出 {k}KB; 若 b>0 ,输出 {b}B; 如果同一组数据有多个上述输出,则输出按照顺序,且之间用空格分隔。 有 1GB=1024MB=1048576KB=1073741824B ,在本题中使用该标准。 输入样例 10 char c[200]; int a[2000010]; int i[1000005]; long long l[1048576]; short s[536870913]; long long s[1000000000]; long long s[999999999]; char Yv6ML9zf0w0sY[586638]; short o4Rfn9FUdmdJZEb7KDyQvacaEqxwGPset8PWFFr[3820184]; char zcnZLu4InqQ3ipjl1YrqJ0070FAVS[41655]; 输出样例 200B 7MB 644KB 552B 3MB 834KB 276B 8MB 1GB 2B 7GB 461MB 404KB 7GB 461MB 403KB 1016B 572KB 910B 7MB 293KB 304B 40KB 695B
最新发布
11-05
这个问题要求我们: 1. 解析一个 C 语言数组声明; 2. 计算该数组所占内存大小(字节数); 3. 将总字节数转换为以 `GB`、`MB`、`KB`、`B` 分层表示的形式,每层不超过 1024; 4. 按照格式输出非零的部分。 --- ## ✅ 解题步骤 ### 🧮 单位换算(本题标准): - 1 KB = $2^{10}$ = 1024 B - 1 MB = $2^{20}$ = 1048576 B - 1 GB = $2^{30}$ = 1073741824 B 所以: ```c 1GB = 1073741824 B 1MB = 1048576 B 1KB = 1024 B ``` --- ### 🔍 输入格式解析 每行是:`类型 名称[长度];` 例如:`int a[2000010];` 我们需要提取: - 类型 → 得到每个元素的大小(bytes) - 长度 → 数组元素个数 然后计算总空间: > **s = sizeof(type) × length** 再将 `s` 拆分为: > s = g×1GB + m×1MB + k×1KB + b×1B 其中:g ≥ 0, 且 m,k,b ∈ [0, 1024) 注意:**不能直接除以 1024 的幂次后取模**,必须逐向下拆分! 比如: ```python g = s // 1073741824 s %= 1073741824 m = s // 1048576 s %= 1048576 k = s // 1024 b = s % 1024 ``` 但要保证 m < 1024, k < 1024, b < 1024 —— 这个自然满足。 --- ## ✅ C++ 实现代码(可提交) ```cpp #include <iostream> #include <string> #include <cctype> #include <vector> using namespace std; // 单位常量 const long long GB = 1073741824; // 2^30 const long long MB = 1048576; // 2^20 const long long KB = 1024; // 2^10 // 获取类型对应的字节大小 long long getTypeSize(const string& type) { if (type == "char") return 1; if (type == "short") return 2; if (type == "int") return 4; if (type == "long long") return 8; return 0; } // 解析数组长度(从 "[xxx];" 中提取数字) long long parseLength(const string& line) { int start = -1; for (int i = 0; i < line.size(); ++i) { if (line[i] == '[') { start = i + 1; break; } } string numStr; for (int i = start; i < line.size(); ++i) { if (isdigit(line[i])) { numStr += line[i]; } else if (line[i] == ']') { break; } } return stoll(numStr); } // 解析类型名 string parseType(const string& line) { for (int i = 0; i < line.size(); ++i) { if (line[i] == ' ') { return line.substr(0, i); } if (line.substr(i, 4) == "long") { // 处理 "long long" if (i + 9 < line.size() && line.substr(i, 9) == "long long") return "long long"; } } return ""; } int main() { int T; cin >> T; cin.ignore(); // 忽略换行 while (T--) { string line; getline(cin, line); // 解析类型和长度 string type = parseType(line); long long len = parseLength(line); long long elemSize = getTypeSize(type); long long total = elemSize * len; // 拆解为 GB, MB, KB, B long long g = total / GB; total %= GB; long long m = total / MB; total %= MB; long long k = total / KB; long long b = total % KB; // 输出非零部分,空格分隔 bool first = true; if (g > 0) { cout << g << "GB"; first = false; } if (m > 0) { if (!first) cout << " "; cout << m << "MB"; first = false; } if (k > 0) { if (!first) cout << " "; cout << k << "KB"; first = false; } if (b > 0) { if (!first) cout << " "; cout << b << "B"; } // 注意:即使全为0也要输出至少一个0?但题目保证长度≥1,不会出现0 cout << endl; } return 0; } ``` --- ## ✅ 示例验证 拿输入样例: ``` int a[2000010]; ``` - `sizeof(int)=4`, `len=2000010` - `total = 4 * 2000010 = 8000040 B` 分解: - `g = 8000040 / 1073741824 = 0` - `m = 8000040 / 1048576 = 7` → 7 * 1048576 = 7340032 - 剩余:8000040 - 7340032 = 660008 - `k = 660008 / 1024 = 644` → 644 * 1024 = 659456 - 剩余:660008 - 659456 = 552 - `b = 552` → 输出:`7MB 644KB 552B` ✅ 匹配样例! --- ## 📝 关键点总结 | 技巧 | 说明 | |------|------| | `parseType` 特别处理 `"long long"` | 因为有两个单词 | | 使用 `stoll()` | 防止 `length` 达到 1e9 导致溢出 | | 逐取商取模 | 不能用浮点或错误单位换算 | | 输出控制空格 | 只在非首次时加空格 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GDRetop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值