L1-001 个位数统计
题目内容:
解题思路:
略
C代码展示:
#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
L1-002 打印沙漏
题目内容:
解题思路:
题目要求打印一个“沙漏”,我们可以将该形状由中间分开,以下方为例,每一行的数量满足等差数列,而 整体打印个数 = 2 * “一半” - 1,以上是题目的初步了解。
第一步,我们需要计算出“一半”有多少行,另一半就可以类比得出。可以通过循环,当退出该循环时,i - 1即为需要打印的“一半”的行数。
for (i=1; 2 * i * i - 1 <= N; i++);
第二步,打印符号前的空格,以及该符号。空格为一个公差为1的等差数列,符号为一个公差为2的等差数列。
第三步,计算剩余符号数量,这一步可以和第一步同时得出。
C代码展示:
#include <stdio.h>
int main()
{
int N, i=1, m;
char a;
scanf("%d %c", &N, &a);
// 计算帕斯卡三角形的行数,直到2*i*i-1大于N
for (; 2 * i * i - 1 <= N; i++);
i--; // 因为上面的循环会多增加1,所以这里减去1来得到正确的行数
m = N - 2 * i * i + 1; // 计算最后输出的整数m
// 打印帕斯卡三角形的上半部分
for(int j = 0; j<i-1; j++){
for (int k=j; k>0; k--) {
printf(" "); // 打印空格,形成三角形的对称结构
}
for (int k = 2 * (i - j) - 1; k>0; k--){
printf("%c", a); // 打印字符a,形成三角形的边缘
}
printf("\n");
}
// 打印帕斯卡三角形的下半部分,包括中间的数字
for(int j = i-1; j>=0; j--){
for (int k=j; k>0; k--) {
printf(" "); // 打印空格
}
for (int k = 2 * (i - j) - 1; k>0; k--){
printf("%c", a); // 打印字符a
}
printf("\n");
}
printf("%d\n", m);
return 0;
}
L1-003 个位数统计
题目内容:
解题思路:
注意点:题目中所输入的正整数N已经超出 ing 或者 long long int 所能容纳的长度,应该用整形数组进行存储。
第一步,可以定义一个哈希表,进行存储每个数字出现的次数。
第二步,循环遍历哈希表,当该位置的数值不为零时输出。
C代码展示:
#include <stdio.h>
#include <string.h>
int main()
{
char s[1005];
int cnt[10] = {0}; // 定义一个整型数组cnt,用于存储0-9每个数字出现的次数,初始值都为0
scanf("%s", s);
for (int i=0; i<strlen(s); i++) {
cnt[s[i] - '0'] ++; // 将字符转换为数字,并在cnt数组中对应的位置增加计数
}
for (int i=0; i<10; i++) {
if (cnt[i] != 0) { // 如果某个数字的计数不为0
printf("%d:%d\n", i, cnt[i]); // 输出该数字及其计数
}
}
return 0;
}
L1-004 计算摄氏温度
题目内容:
解题思路:
略。
C语言代码展示:
#include <stdio.h>
int main()
{
int F, C;
scanf("%d", &F);
C=5*(F-32)/9;
printf("Celsius = %d\n", C);
return 0;
}
L1-005 考试座位号
题目内容:
解题思路:
本题使用结构体相对容易,或者可以使用二维的长整型数组。本题难点在于输入的存储,后续判断输出都相对简单。
C语言代码展示:
//使用结构体
#include <stdio.h>
typedef struct student { // 定义一个名为student的结构体,用于存储学生信息
char s[20]; // 学生名字
int a; // 学校编号
int b; // 成绩
} student;
int main() {
int N, M, sch; // 定义整数N(学生数量),M(查询数量),sch(学校编号)
student x[1005]; // 定义一个学生结构体数组x,最多存储1005个学生信息
scanf("%d", &N); // 从标准输入读取学生数量
for (int i = 0; i < N; i++) { // 循环读取每个学生的信息
scanf("%s %d %d", x[i].s, &x[i].a, &x[i].b); // 读取学生的名字、学校编号和成绩
}
scanf("%d", &M); // 从标准输入读取查询数量
for (int i = 0; i < M; i++) { // 循环处理每个查询
scanf("%d", &sch); // 读取学校编号
for (int j = 0; j < N; j++) { // 遍历所有学生信息
if (x[j].a == sch) { // 如果学生所在的学校编号与查询的学校编号相同
printf("%s %d\n", x[j].s, x[j].b); // 输出学生的名字和成绩
}
}
}
return 0;
}
//使用二位长整型数组
#include<stdio.h>
int main()
{
int N,M;
scanf("%d",&N);
long long a[N][3];
int i,j,k;
for(i=0;i<N;i++)
{
scanf("%lld %lld %lld",&a[i][0],&a[i][1],&a[i][2]);
}
scanf("%d",&M);
int b[M];
for(i=0;i<M;i++)
{
scanf("%d",&b[i]);
}
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
if(a[j][1]==b[i])
{
printf("%lld %lld",a[j][0],a[j][2]);
printf("\n");
continue;
}
}
}
}
L1-006 连续因子
题目内容:
解题思路:
重点:无论该数除了多少个数,总还有有一个数能够把它除尽,即只需找出最长能被除的连续因子即可,不用关心商的值。
第一步,求出该数所有因子,大于 根号下该数 的因子长度最长就为1,故可以只求 根号下该数 。
第二步,判断该数是否为质数,若为质数即输出 “1\n” ,若不是则进行下一步。
第三步,写一个双重循环,来寻找最长连续因子。
C语言代码展示:
#include <stdio.h>
#include <math.h>
int prime(int n) {
for (int i = 2; i <= sqrt(n); i++) { // 遍历从2到sqrt(n)的整数
if (n % i == 0) return 0; // 如果n能被i整除,则n不是质数,返回0
}
return 1; // 如果没有找到能整除n的i,则n是质数,返回1
}
int main() {
int N, k = 1, len = 0, i, j, s = 1, start = 1;
scanf("%d", &N);
if (prime(N)) {
printf("1\n%d\n", N); // 如果是质数,输出1和N
} else {
for (i = 2; i <= sqrt(N); i++) {
s = 1;
for (j = i; s * j <= N; j++) { // 从i开始,尝试构建乘积序列
s *= j; // 将当前整数j加入乘积序列
if (N % s == 0 && len < j - i + 1) { // 如果s能整除N,并且序列长度大于当前最长序列
len = j - i + 1; // 更新序列长度
start = i; // 更新序列起始位置
}
}
}
printf("%d\n", len);
for (i = start; i < start + len - 1; i++) { // 遍历序列,打印序列中的每个整数
printf("%d*", i);
}
printf("%d\n", i);
}
return 0;
}
L1-007 念数字
题目内容:
解题思路:
可以定义一个二维字符数组,用来记录所有拼音,方便后续输出。
C语言代码展示:
#include <stdio.h>
#include <string.h>
int main() {
char s[15][10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
// 定义一个二维字符数组,用于存储中文数字的读音
char x[1000];
gets(x); // 使用gets函数读取一行输入,存储到x中。
for (int i = 0; i < strlen(x) - 1; i++) {
// 遍历字符串x中的每个字符,直到倒数第二个字符
if (x[i] == '-') { // 如果字符是'-',则输出"fu "
printf("fu ");
} else {
printf("%s ", s[x[i] - '0']);
// 否则,根据字符的ASCII值减去'0'的ASCII值,作为索引输出对应的中文数字
}
}
printf("%s\n", s[x[strlen(x) - 1] - '0']);
// 输出字符串x的最后一个字符对应的中文数字,并换行
return 0;
}
L1-008 求整数段和
题目内容:
解题思路:
难点1:每个数字输出占五个字符宽度,可以使用 "%5d"。
难点2:每行只输出5个数字,可以定义一个变量来记录该行输出的个数。
C语言代码展示:
#include <stdio.h>
int main() {
int a, b, k=0, sum=0;
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++) {
printf("%5d", i); // 打印当前整数i,占位宽度为5
k++; // 计数器k增加1
sum += i; // 将当前整数i加到sum上
if (k == 5) { // 如果计数器k达到5,重置计数器,并换行
k = 0;
printf("\n");
}
}
if ((b - a + 1) % 5 != 0) printf("\n"); // 如果最后不足5个数,也输出一个换行符
printf("Sum = %d\n", sum);
return 0;
}