@滴水不穿石 转专业模拟考试的题,有点点没思路,感谢!顺便问问一下能不能推荐点转专业可能会出的timu,已经学习了高精度乘法,冒泡排序,高精度加法,分解质因数但是觉得还远远不够
希望对你有帮助,代码仅供参考!有问题多谢提出!谢谢!
#include <stdio.h>
#include <time.h>
#include <string.h>
struct
{
int year;
int mon;
int mday;
} ys[5];
const int arr[15] = { 1868, 9, 8, 1912, 7, 30, 1926, 12, 25, 1989, 1, 8, 2019, 5, 1 };
int main(int argc, char *argv[])
{
// 初始化日本五个纪年日期
for (int i = 0, j = 0; i < 5; i++)
{
ys[i].year = arr[j++];
ys[i].mon = arr[j++];
ys[i].mday = arr[j++];
}
char ch;
int y, m, md, n;
scanf("%c%d/%d/%d%d", &ch, &y, &m, &md, &n);
switch (ch)
{
case 'M':
y += ys[0].year - 1;
break;
case 'T':
y += ys[1].year - 1;
break;
case 'S':
y += ys[2].year - 1;
break;
case 'H':
y += ys[3].year - 1;
break;
case 'R':
y += ys[4].year - 1;
break;
default:
puts("输入有误!");
return -1;
}
time_t t, tim[5];
struct tm tt, tt2[5];
tt.tm_year = y - 1900;
tt.tm_mon = m - 1;
tt.tm_mday = md + n;
tt.tm_hour = 23;
tt.tm_min = 0;
tt.tm_sec= 0;
// 转成秒
t = mktime(&tt);
for (int i = 0; i < 5; i++)
{
tt2[i].tm_year = ys[i].year - 1900;
tt2[i].tm_mon = ys[i].mon - 1;
tt2[i].tm_mday = ys[i].mday;
tt2[i].tm_hour = 0;
tt2[i].tm_min=0;
tt2[i].tm_sec=0;
tim[i] = mktime(&tt2[i]);
}
// 重新输出具体日期
char no;
// t tim
if (t >= tim[4])
{
no = 'R';
tt.tm_year += -118;
}
else if (t >= tim[3] && t < tim[4])
{
no = 'H';
tt.tm_year += -88;
}
else if (t >= tim[2] && t < tim[3])
{
no = 'S';
tt.tm_year += -25;
}
else if (t >= tim[1] && t < tim[2])
{
no = 'T';
tt.tm_year += -11;
}
else if (t < tim[1])
{
no = 'M';
tt.tm_year += 33;
}
// 输出
printf("%c%d/%d/%d", no, tt.tm_year, tt.tm_mon + 1, tt.tm_mday);
return 0;
}
引用chatgpt作答:
第一题:
#include <stdio.h>
#include <string.h>
// 年号结构体
typedef struct {
char name[5]; // 年号名称,不超过4个字符
int start_year; // 年号起始年份
} Era;
// 年号列表
Era eras[] = {
{"M", 1868},
{"T", 1912},
{"S", 1926},
{"H", 1989},
{"R", 2019}
};
int eras_count = sizeof(eras) / sizeof(Era);
// 获取指定日期的年号
Era get_era(int year) {
for (int i = eras_count - 1; i >= 0; i--) {
if (year >= eras[i].start_year) {
return eras[i];
}
}
return eras[0];
}
// 根据年号和年份获取年号纪年的年份
int get_era_year(Era era, int year) {
return year - era.start_year + 1;
}
// 格式化输出年号纪年日期
void print_era_date(int year, int month, int day, Era era) {
printf("%s%d/%d/%d\n", era.name, get_era_year(era, year), month, day);
}
int main() {
int year, month, day, days;
while (scanf("%d/%d/%d %d", &year, &month, &day, &days) != EOF) {
// 计算推后的日期
int total_days = 0;
for (int i = 0; i < eras_count; i++) {
int era_year = get_era_year(eras[i], year);
if (era_year > 1) {
total_days += (eras[i].start_year + era_year) % 4 == 0 ? 366 : 365;
} else {
total_days += (eras[i].start_year + era_year - 1) % 4 == 0 ? 366 : 365;
}
}
total_days += day - 1; // 减去起始日期,从0开始计数
for (int i = 1; i < month; i++) {
if (i == 2) {
total_days += (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 29 : 28;
} else if (i == 4 || i == 6 || i == 9 || i == 11) {
total_days += 30;
} else {
total_days += 31;
}
}
total_days += days; // 推后指定的天数
// 计算推后的日期所在的年号和年份
Era era = get_era(year);
int era_year = get_era_year(era, year);
while (total_days >= (era_year > 1 ? (era.start_year + era_year) % 4 == 0 ? 366 : 365 : (era.start_year + era_year - 1) % 4 == 0 ? 366 : 365)) {
total_days -= (era_year > 1 ? (era.start_year + era_year - 1) % 4 == 0 ? 366 : 365);
era = eras[(era.start_year - 1) % 5 + 1];
era_year = 1;
}
// 计算推后的日期的年份、月份和日期
int remaining_days = total_days;
int new_year = era.start_year + era_year - 1;
int new_month = 1;
int new_day = 1;
while (remaining_days >= 28) {
int month_days = 31;
if (new_month == 2) {
month_days = (new_year % 4 == 0 && (new_year % 100 != 0 || new_year % 400 == 0)) ? 29 : 28;
} else if (new_month == 4 || new_month == 6 || new_month == 9 || new_month == 11) {
month_days = 30;
}
if (remaining_days >= month_days) {
remaining_days -= month_days;
new_month++;
} else {
break;
}
}
new_day += remaining_days;
// 输出推后的日期
print_era_date(new_year, new_month, new_day, era);
}
return 0;
}
代码中使用了结构体来存储年号的名称和起始年份,使用了函数来计算年号纪年的年份、获取指定日期的年号和格式化输出年号纪年日期。输入使用了多行输入,每行含有一个日本年号纪年格式的日期和后推天数,输出格式化的推后日期。
其中,计算推后日期的过程比较复杂,需要先计算指定日期所在的年号和年份,然后根据推后的天数计算出推后的日期所在的年号和年份。接着,使用循环计算推后的日期的年份、月份和日期,最后输出格式化的推后日期。
第二题:
#include <stdio.h>
int main() {
char gengo; // 年号
int year, month, day; // 年、月、日
int days; // 后推天数
while (scanf("%c%d/%d/%d%d", &gengo, &year, &month, &day, &days) == 5) {
// 把年号转换成公元年份
int gregorian_year;
switch (gengo) {
case 'M': gregorian_year = 1868 + year - 1; break;
case 'T': gregorian_year = 1912 + year - 1; break;
case 'S': gregorian_year = 1926 + year - 1; break;
case 'H': gregorian_year = 1989 + year - 1; break;
case 'R': gregorian_year = 2019 + year - 1; break;
}
// 把公元日期转换成距离元年1月1日的天数
int days_since_1_1_1 = 0;
for (int y = 1; y < gregorian_year; y++) {
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
days_since_1_1_1 += 366; // 闰年
} else {
days_since_1_1_1 += 365; // 平年
}
}
for (int m = 1; m < month; m++) {
if (m == 2) {
if (gregorian_year % 4 == 0 && (gregorian_year % 100 != 0 || gregorian_year % 400 == 0)) {
days_since_1_1_1 += 29; // 闰年的2月
} else {
days_since_1_1_1 += 28; // 平年的2月
}
} else if (m == 4 || m == 6 || m == 9 || m == 11) {
days_since_1_1_1 += 30; // 小月
} else {
days_since_1_1_1 += 31; // 大月
}
}
days_since_1_1_1 += day - 1; // 日期
// 后推
days_since_1_1_1 += days;
// 把天数转换成公元日期
int y = 1, m = 1, d = 1;
while (days_since_1_1_1 >= 365) {
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
if (days_since_1_1_1 >= 366) {
days_since_1_1_1 -= 366;
y++;
} else {
break;
}
} else {
if (days_since_1_1_1 >= 365) {
days_since_1_1_1 -= 365;
y++;
} else {
break;
}
}
}
while (days_since_1_1_1 >= 28) {
if (m == 2) {
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
if (days_since_1_1_1 >= 29) {
days_since_1_1_1 -= 29;
m++;
} else {
break;
}
} else {
if (days_since_1_1_1 >= 28) {
days_since_1_1_1 -= 28;
m++;
} else {
break;
}
}
} else if (m == 4 || m == 6 || m == 9 || m == 11) {
if (days_since_1_1_1 >= 30) {
days_since_1_1_1 -= 30;
m++;
} else {
break;
}
} else {
if (days_since_1_1_1 >= 31) {
days_since_1_1_1 -= 31;
m++;
} else {
break;
}
}
}
d += days_since_1_1_1;
// 把公元日期转换成年号
char gengo_out;
int year_out;
if (y >= 2019) {
gengo_out = 'R';
year_out = y - 2018;
} else if (y >= 1989) {
gengo_out = 'H';
year_out = y - 1988;
} else if (y >= 1926) {
gengo_out = 'S';
year_out = y - 1925;
} else if (y >= 1912) {
gengo_out = 'T';
year_out = y - 1911;
} else {
gengo_out = 'M';
year_out = y - 1867;
}
// 输出结果
printf("%c%d/%d/%d\n", gengo_out, year_out, m, d);
}
return 0;
}
这段代码的实现思路如下:
需要注意的是,在转换公元日期和距离元年1月1日的天数时,要考虑闰年和月份天数的变化。在转换天数为公元日期时,要先判断当前年份是否为闰年,再判断当前月份的天数。在转换公元日期为距离元年1月1日的天数时,要先累加当前年份之前的天数,再累加当前月份之前的天数,最后再累加当前日期。
以下内容部分参考ChatGPT模型:
很高兴能够帮助你!关于转专业模拟考试的题,以下是一个简单的例子:
题目:在 C 语言中,如何交换两个变量的值?
解答:可以使用中间变量的方式来交换两个变量的值,如下所示:
int a = 1, b = 2;
int temp; //定义中间变量
temp = a;
a = b;
b = temp;
printf("a = %d, b = %d", a, b);
输出结果为:a = 2, b = 1
对于转专业可能会出的题目,以下是一些可能的题目类型和对应的例子:
int arr[5] = {1, 2, 3, 4, 5};
int i, temp;
for(i = 0; i < 5 / 2; i++){
temp = arr[i];
arr[i] = arr[4 - i];
arr[4 - i] = temp;
}
for(i = 0; i < 5; i++){
printf("%d ", arr[i]);
}
输出结果为:5 4 3 2 1
char str[] = "Hello World";
int i, j;
char temp;
for(i = 0, j = strlen(str) - 1; i < j; i++, j--){
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
printf("%s", str);
输出结果为:dlroW olleH
int a = 1, b = 2;
int *p1, *p2;
int temp;
p1 = &a;
p2 = &b;
temp = *p1;
*p1 = *p2;
*p2 = temp;
printf("a = %d, b = %d", a, b);
输出结果为:a = 2, b = 1
希望以上例子能够帮助到你,加油!
不知道你这个问题是否已经解决, 如果还没有解决的话:python
def bubble_sort(arr):
n = len(arr)
for i in range(n-1):
for j in range(n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
# 测试代码
arr = [3, 7, 1, 9, 2]
print(bubble_sort(arr)) # 输出 [1, 2, 3, 7, 9]
python
import math
def is_prime(n):
if n < 2:
return False
for i in range(2, int(math.sqrt(n))+1):
if n % i == 0:
return False, i
return True, None
# 测试代码
print(is_prime(6)) # 输出 (False, 2)
print(is_prime(17)) # 输出 (True, None)