XTUOJ C++小练习(素数的判断,数字塔,字母塔)
素数的判断-----------------------------------------------------------------------------------------------------------------
#include <cstdio>
using namespace std;int main() {unsigned int n;// %u 格式说明符,读取无符号整数,_CRT_INSECURE_DEPRECATE_MEMORY 相关警告// 这里传入额外参数(如果是字符串才会用到,整数读取可传 0 或随意值,不同编译器处理有差异)while (scanf("%u", &n, sizeof(n)) == 1) {if (n == 0) break;if (n <= 1) {printf("No\n");}else if (n == 2) {printf("Yes\n");}else if (n % 2 == 0) {printf("No\n");}else {bool is_prime = true;for (unsigned int i = 3; i * i <= n; i += 2) {if (n % i == 0) {is_prime = false;break;}}printf("%s\n", is_prime ? "Yes" : "No");}}return 0;
}
一、筛选方法:先过滤掉0,1,2特殊数字,再筛过偶数,在奇数里找公因子。
二、细节:
1.用i*i ≤ n
代替i ≤ sqrt(n)
,避免 sqrt 函数的性能损耗和精度误差。
2.使用scanf/printf
替代cin/cout
(默认情况下更快),应对大量输入。(<cstdio>)
3.用unsigned int
存储n
,刚好覆盖0
到2³²-1
的范围,避免溢出。
三、注意:在较新的 Visual Studio 编译器中,scanf
等函数被标记为 “不安全”,编译器建议使用更安全的 scanf_s
(微软为 C 标准库函数做的安全增强版本 ),或者通过定义宏来禁用安全警告。
数字塔-----------------------------------------------------------------------------------------------------------------
#include <cstdio>
using namespace std;int main() {int i = 0;int n,line,sta;while (scanf("%d", &line) == 1 && line!=0){i++;printf("case %d:\n",i);sta = 1;for(int w = line;w > 0;w--){for (int j = w - 1;j > 0;j--) printf(" ");for (int k = sta * 2 - 1;k > 0;k--) printf("%d", sta);printf("\n");sta++;}}return 0;
}
字母塔-----------------------------------------------------------------------------------------------------------------
#include <iostream>
using namespace std;int main() {char target;int case_num = 1; // 记录样例编号// 循环读取输入,直到遇到 '#' 结束while (cin >> target && target != '#') {// 输出样例标题cout << "case " << case_num << ":" << endl;case_num++;// 1. 计算最大层级(输入字母对应的层级)int max_level = target - 'A' + 1; // 核心:字母转数字(层级)// 2. 遍历每一行(从最大层级向下到1)for (int i = max_level; i >= 1; i--) {// (1)输出左侧空格:第i行的空格数 = max_level - ifor (int space = 1; space <= max_level - i; space++) {cout << " ";}// (2)输出字母部分:先递增到当前最大字母,再递减回A// 左半部分:A → curr_char(递增)char curr_char = 'A'; // 从A开始while (curr_char < 'A' + (i - 1)) { // 到 curr_char = 'A'+i-1 停止cout << curr_char;curr_char++;}// 右半部分:curr_char → A(递减)while (curr_char >= 'A') {cout << curr_char;curr_char--;}// (3)换行,准备下一行cout << endl;}}return 0;
}