L1-012 计算指数、L1-013 计算阶乘和、L1-014 简单题、 L1-015 跟奥巴马一起画方块、 L1-016 查验身份证
L1-012 计算指数
题目描述
对任意给定的不超过 10 的正整数 n n n,输出 2 n 2^n 2n 的值。
输入格式
一行中给出一个不超过 10 的正整数 n n n。
输出格式
2^n = 计算结果
输入样例
5
输出样例
2^5 = 32
解题思路
- 读入整数 n n n
- 计算 2 n 2^n 2n
- 按指定格式输出
C++ 代码
#include <iostream>
#include <cmath>
// cmath = C math,是 C++ 的数学头文件
// 必须写这一行,才能使用 pow ( ) 函数
using namespace std;
int main() {
int n;
cin >> n;
int res = pow(2, n);
cout << "2^" << n << " = " << res << endl;
return 0;
}
双引号 " " 的作用
- 加双引号:里面的内容是字符串,会原样输出。
例如"2^"、" = "是固定文字,直接显示在屏幕上。 - 不加引号:是变量,输出变量里面存储的数值。
例如n、ans会输出它们的值。
拼接过程示例
当 n = 5 , a n s = 32 n=5, ans=32 n=5,ans=32 时:
cout << "2^" << n << " = " << ans << endl;
输出结果:
2^5 = 32
L1-013 计算阶乘和
题目描述
计算 S = 1! + 2! + 3! + … + N! 的值(N ≤ 10)。
- 阶乘:n! = 1×2×3×…×n
- 例如:3! = 1×2×3 = 6
输入格式
一行中给出一个不超过 10 的正整数 N。
输出格式
一行输出 S 的值。
输入样例
3
输出样例
9
解题思路
- 循环计算每一个数的阶乘
- 把所有阶乘结果累加起来
- 输出最终的和
C++ 完整代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int sum = 0; // 存储阶乘的和
int fact = 1; // 存储当前数的阶乘
for(int i=1; i<=n; i++){
fact = fact * i; // 计算 i!
sum = sum + fact; // 累加到总和
}
cout << sum << endl;
return 0;
}
L1-014 简单题
题目描述
没有任何输入,只需要在一行输出:
This is a simple problem.
输入格式
无
输出格式
This is a simple problem.
C++ 代码
#include <iostream>
using namespace std;
int main() {
cout << "This is a simple problem." << endl;
return 0;
}
L1-015 跟奥巴马一起画方块
题目描述
输入正方形边长 N 和字符 C,输出用 C 组成的正方形。
行数 = 列数的 50%,四舍五入取整。
输入格式
一行给出 N(3≤N≤21)和字符 C,用空格隔开。
输出格式
输出对应正方形。
输入样例
10 a
输出样例
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
解题思路
- 输入 N 和字符 c
- 计算行数:行 = (N + 1) / 2(自动四舍五入)
- 循环 行次,每行输出 N 个字符 c
C++ 完整代码
#include <iostream>
using namespace std;
int main() {
int n;
char c;
cin >> n >> c; // 输入边长和字符
// 计算行数:四舍五入 n/2
int row = (n + 1) / 2;
// 循环 row 行
for(int i = 1; i <= row; i++) {
// 每行输出 n 个字符
for(int j = 1; j <= n; j++) {
cout << c;
}
cout << endl; // 每行结束换行
}
return 0;
}
1. 行数怎么算?
-
行数 = 边长的一半,四舍五入
-
公式:row = (n + 1) / 2
-
为什么行数是 (n + 1) / 2?
题目要求:行数 = n 的一半,四舍五入。
但 C++ 的整数除法是向下取整(直接砍掉小数),不会自动四舍五入。
想要实现四舍五入,公式是:row = (n + 1) / 2
例子:
n = 10 → (10+1)/2 = 5
n = 3 → (3+1)/2 = 2
2. 双层循环
- 外层循环:控制多少行
- 内层循环:控制每行多少个字符
L1-016 查验身份证
题目描述
查验身份证是否合法:
- 前17位必须都是数字
- 按规则计算校验码,和最后一位必须一致
不合法就输出号码,全部合法输出All passed
输入格式
第一行:N(号码数量)
接下来 N 行:每行18位身份证号
输出格式
输出有问题的号码,全部正确输出 All passed
权重 + 校验码对应
权重:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
C++ 完整代码
#include <iostream>
#include <string>
using namespace std;
int main() {
// 权重数组
int w[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
// 校验码对应数组
char m[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
int n;
cin >> n;
bool allPass = true; // 标记是否全部通过
for(int i=0; i<n; i++){
string id;
cin >> id;
bool ok = true;
// 第一步:检查前17位是不是数字
for(int j=0; j<17; j++){
if(id[j] < '0' || id[j] > '9'){
ok = false;
break;
}
}
// 第二步:前17位合法,计算加权和
if(ok){
int sum = 0;
for(int j=0; j<17; j++){
sum += (id[j] - '0') * w[j];
}
int z = sum % 11; // 取模得到Z
if(id[17] != m[z]){
ok = false;
}
}
// 不合法就输出
if(!ok){
cout << id << endl;
allPass = false;
}
}
// 全部通过
if(allPass){
cout << "All passed" << endl;
}
return 0;
}
#include <iostream>
#include <string>
#include <cctype> //isdigit():判断字符是不是数字 0~9
using namespace std;
int main() {
int w[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char m[] = {'1','0','X','9','8','7','6','5','4','3','2'};
int n;
cin >> n;
bool all = true;
while (n--) {
//在 C++ 里,数字 0 表示假,非 0 表示真。while( 真 ) → 继续循环,while( 假 ) → 停止循环
string s;
cin >> s;
bool ok = true;
for (int i = 0; i < 17; i++)
if (!isdigit(s[i])) ok = false;
if (ok) {
int sum = 0;
for (int i = 0; i < 17; i++)
sum += (s[i]-'0') * w[i];
//s[i] 是字符,不能直接计算,必须用 s[i] - '0' 把字符变成真正的数字
//字符 '0' 的码值:48 字符 '5' 的码值:53
if (s[17] != m[sum%11]) ok = false;
}
if (!ok) {
cout << s << endl;
all = false;
}
}
if (all) cout << "All passed" << endl;
return 0;
}
1. 两个固定数组(
int w[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char m[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
- w:前17位权重
- m:Z值对应的正确校验码
2. 前17位必须是数字
if(id[j] < '0' || id[j] > '9') 不合法
只要有一位不是数字,直接判定错误。
3. 计算校验码
- 前17位 × 对应权重 → 求和
- 和 % 11 → 得到 Z
- 用 Z 去 m数组 找正确的最后一位
- 和身份证最后一位对比,不一样就是错的
4. 字符串转数字
id[j] - '0'
把字符 '5' 变成数字 5 才能计算。
5. 标记变量
ok:判断当前身份证是否合法allPass:判断全部身份证是否合法
1776



被折叠的 条评论
为什么被折叠?



