大一学习c语言积攒的家当,一次性发出来
题目全部来自xdoj题库
题解算是比较优的解法吧
前言
提示:之后还会不断更新 部分代码来自于网络
提示:有问题的地方欢迎在评论区留言欢迎提出宝贵建议
分解质因数
题目描述:
每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,
这几个素数就都叫做这个合数的质因数。编写程序将一个正整数分解质因数
输入描述:
输入一个正整数n(2<n<1000)
输出描述:
形如a*b*b*c,质因数按照从小到大的顺序排列
输入样例:
90
输出样例:
2*3*3*5
//破解方法:只需要从最小的质数开始除,不要想复杂,很多编程问题其实就是数学问题
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
//把n从质数2开始除,直到除不开
//例如n本来有一个因数为4,连续除两次2就等效
for (int i = 2; i <=n ; ++i)
{
while(i!=n)
{
//在这个循环中能进入判断的就只剩质数了
if (n%i==0)
{
printf("%d*",i);
n/=i;
}
else break;
}
}
printf("%d",n);
return 0;
}
质数之和
问题描述 输入一个大于20的正整数p,求出正整数范围内第p个质数(或素数,大于1且只能被1和自己整除的正整数,)到第p+10个质数之和。其中,第1个质数为2,第2个质数为3,第3个质数为5,第4个质数为7,依次类推。
输入说明 :一行输入1个整数p,20< p <150。 输出说明 第p个质数到第p+10个质数之和。
输入样例: 21
输出样例: 1081
//
#include <stdio.h>
#include <stdlib.h>
int isprime(int x,int knownprimes[],int numberofknownprimes);
int prime[2000];
int main(int argc, char const *argv[])
{
int p;
scanf("%d",&p);
prime[0] = 2;
int count=1;//已知质数的个数
int i=3;//除已知的质数2以外第一个质数
//找质数
while (count<=p+10){
if (isprime(i ,prime,count))
{
prime[count++]=i;
}
i++;
}
int sum;//质数和
for (int i = p-1; i < p+10; ++i)
{
sum+=prime[i];
}
printf("%d",sum );
return 0;
}
int isprime(int x,int knownprimes[],int numberofknownprimes)
{
int ret=1;
for (int i=0 ;i<numberofknownprimes;i++)
{
if (x%knownprimes[i]==0)
{
ret=0;
break;
}
}
return ret;
}
#include<stdio.h>
#include<math.h>
int main()
{
int i,inum=1,isum=0;
int p;
int ret;
scanf("%d",&p);
for(i=3;;i++)
{
ret=1;
for(int j=2;j<=sqrt(i);j++)
{
if(i%j==0) ret=0;
}
if(ret)
{ inum++;
if(inum>=p&&inum<=p+10)
isum+=i;
}
else if(inum>p+10)
break;
}
printf("%d",isum);
return 0;
}
累加和校验
类别
流程控制
时间限制
1S
内存限制
256Kb
问题描述
数据传输中一种常见的校验方式是累加和校验。其实现方式是在一次通讯数据包的最后加入一个字节的校验数据。
这个校验字节内容为前面数据包中所有数据按字节累加所得结果的最后一个字节。例如:
要传输的信息为: TEST(ASCII码为0x54,0x45,0x53,0x54)
四个字节的累加和为:0x54+0x45+0x53+0x54=0x140
校验和为累加和的最后一个字节,即0x40,也就是十进制的64
现在请设计一个程序计算给出的待传输信息的累加校验和
输入说明
输入为一个字符串,字符串长度不超过100个字符
输出说明
输出一个十进制整数,表示输入字符串的累加校验和。
输入样例
TEST
输出样例
64
int main()
{
char str[101]={'\0'};
gets(str);
int i, sum=0;
for(i=0;'\0'!=str[i];i++)
sum+=str[i];
printf("%d\n",sum&0xFF);
return 0;
}
/*例如,有个数字 0x1234,如果只想将低8位写入到内存中 0x1234&0xff
0x1234 表示为二进制 0001001000110100
0xff 表示为二进制 11111111
两个数做与操作,显然将0xff补充到16位,就是高位补0
此时0xff 为 0000000011111111
与操作 1&0 =0 1&1 =1 这样 0x1234只能保留低八位的数 0000000000110100 也就是 0x34*/
#include <stdio.h>
int main(void)
{
char ch;
int res = 0;
while ((ch = getchar()) != EOF)
res += ch;
printf("%d\n", res % 256);
return 0;
}
单词统计
题目描述:
输入字符串string[N](N≤100),各个单词以空格隔开,单词长度小于等于8,输入单词word[M](M≤8),
在string中查找出相同的单词并统计该单词出现的次数信息,单词不区分大小写,
输出单词和出现次数的信息,数据之间空一格空格。
主函数输入字符串和待统计单词,编写函数count()实现统计和信息输出
输入描述:
输入一行字符以空格隔开各个单词,输入要统计的单词。
输出描述:
输出单词及其出现的次数信息,数据之间空一格。
输入样例:
To be or not to be is a question
to
输出样例:
to 2
- 1
#include<stdio.h>
#include<string.h>
void count(char a[], char b[])
{
int i, j, num = 0;//i标记每个单词的第一位
for (i = 0; i < strlen(a); )
{
int flag = 0; //flag用来统计每个单词和word比较的次数
for (j = 0; a[i + j] != ' ' && a[i + j] != '\0'; j++)//注意最后一个单词末尾是'\0'不是' '
{
if (a[i + j] == b[j])
{
flag += 1;
}
}
i = i + j + 1;//i标记下一个单词的开头
if (flag == strlen(b)&&j==strlen(b))num++;//如果比较次数和word一样,即单词和word相同,则个数+1
}
printf("%s %d", b, num);
}
int main()
{
char string[100], word[8];
gets(string);
gets(word);
count(string, word);
return 0;
}
-
2
#时隔几个月再看自己原来的代码,一个字——烂 #include<stdio.h> #include<string.h> int main() { /*有想法就应该坚持下去*/ //初始化 char string[100]; gets(string); int len; len=strlen(string); strlwr(string); char word[8]; gets(word); // char temp[100];//建立临时数组来存每一个单词 int i=0; int an=0; int step=0; int sum=0; for (char *p=string;*p!='\0';p=p+step)//注意指针的移动,考虑每次循环后的目的 { step=0;//指针要移动的位数 for (char*s=p;*s!=' '; ++s) { if(s-string>len) break; temp[i]=*s; i++; step++; } temp[i]='\0'; step++; sum+=step; //int a=strcmp(temp,word); //printf("#%s",temp); /*多调试*/ if (!(strcmp(temp,word))) { an++; strcpy(temp," "); i=0; } else{ i=0; strcpy(temp," "); } } strcpy(temp," "); i=0; for(char*last=string+sum;*last!='\0';last++) { temp[i]=*last; i++; } if (!(strcmp(temp,word))) { an++; } printf("%s %d",word,an); return 0; }
车牌限行
时间限制: 1 秒
内存限制: 256KB问题描述 问题描述
受雾霾天气影响,某市决定当雾霾指数超过设定值时对车辆进行限行,假设车牌号全为数字,且长度不超过6位,限行规则如下:
(1)限行时间段只包括周一至周五,周六周日不限行;
(2)如果雾霾指数低于200,不限行;
(3)如果雾霾指数大于等于200且低于400,每天限行两个尾号的汽车,周一限行1和6,周二限行2和7,周三限行3和8,周四限行4和9,周五限行5和0;
(4)如果雾霾指数大于等于400,每天限行五个尾号的汽车,周一、周三和周五限行1,3,5,7,9,周二和周四限行0,2,4,6,8。现在给出星期几、雾霾指数和车牌号,判断该车牌号是否限行。
输入说明
输入分为三个整数,第一个整数表示星期几(1~7,1表示周一,2表示周二,依次类推,7表示周日),
第二个整数表示雾霾指数(0~600),第三个整数表示车牌号,整数之间用空格分隔。输出说明
输出为两个部分,第一部分为车牌最后一位数字,第二部分为限行情况,限行输出yes,不限行输出no。输入样例
输入样例1
4 230 80801
输入样例2
3 300 67008输出样例
输出样例1
1 no
输出样例2
8 yes
#include<stdio.h>
int main()
{
int n,t,i,a,b,x;
scanf(“%d%d%d”,&x,&t,&n);
n=n%10;
printf("%d ",n);
if(x6||x7)
printf(“no”);
else
{
if(t<200)
printf("no");
else if(t>=200&&t<400)
{
if(n==x||n==x+5||n==x-5)
printf("yes");
else
printf("no");
}
else
{
if(n%2==x%2)//利用奇数与偶数的特点简化步骤
printf("yes");
else
printf("no");
}
}
return 0;
}
# 单词排序
描述
定义一个二维字符数组str[10][20],行号表示单词序号,列号表示单词最大长度,输入一个正整数N(N≤10),表示单词数,使用函数wd_sort()完成单词的排序,按字母顺序从小到大排列单词,使用指针完成地址传递,主函数完成数组输入和输出。
时间限制
1
内存限制
10000
类别
1
输入说明
输入一个二维字符数组str和一个正整数N,行号表示单词序号,列号表示单词最大长度。
输出说明
格式输出:单词之间空一行。
输入样例
3
word fish egg
输出样例
egg
fish
word
提示
使用指针作形参,实现地址传递。
数组定义后初始化。
使用strcmp()、strcpy()和strlen()函数,头文件string.h。
```c
#include<stdio.h>
#include<string.h>
void wd_sort(char (*str)[20],int n);
int main()
{
char str[10][20];
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",&str[i]);
}
wd_sort(str,n);
for(i=0;i<n;i++)
{
printf("%s\n",str[i]);
}
return 0;
}
void wd_sort(char (*p)[20],int n)
{
int j,i;
char temp[20];
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(strcmp(*(p+j),*(p+j+1))>0)
{
strcpy(temp,*(p+j));
strcpy(*(p+j),*(p+j+1));
strcpy(*(p+j+1),temp);
}
}
}
目录操作
问题描述
在操作系统中,文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。
有一个特殊的目录被称为根目录,是整个文件系统形成的这棵树的根节点,在类Linux系统中用一个单独的 “/”符号表示。
因此一个目录的绝对路径可以表示为“/d2/d3”这样的形式。
当前目录表示用户目前正在工作的目录。为了切换到文件系统中的某个目录,可以使用“cd”命令。
现在给出初始时的当前目录和一系列目录操作指令,请给出操作完成后的当前目录。
假设当前目录为“/d2/d3”,下图给出了cd命令的几种形式,以及执行命令之后的当前目录。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOnyYA8N-1646924572434)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\image-20220228230739687.png)]
输入说明
第一行包含一个字符串,表示当前目录。
后续若干行,每行包含一个字符串,表示需要进行的目录切换命令。
最后一行为pwd命令,表示输出当前目录
注意:
-
所有目录的名字只包含小写字母和数字,cd命令和pwd命令也都是小写。最长目录长度不超过200个字符。
-
当前目录已经是根目录时,cd … 和cd /不会产生任何作用
输出说明
输出一个字符串,表示经过一系列目录操作后的当前目录
输入样例
/d2/d3/d7
cd …
cd /
cd /d1/d6
cd d4/d5
pwd
输出样例
/d1/d6/d4/d5
#include <stdio.h>
#include <string.h>
int main()
{
char s[201]={},str[201]={},a[4];
/*最长目录长度为两百个字符,数组长度定义为201绝对不会出问题
其中s数组为当前目录,str数组为输入的目录切换命令(不包含cd),a数组则储存cd或pwd
把cd与后面的命令分别储存到两个数组中使得string.h中的一些函数得以使用,十分方便*/
int i,len=0; //经常需要用到数组s的长度,总不能每次都strlen(s)吧,那样运行速度会很慢
gets(s);
while(1)
{
scanf("%s",&a);//有空格中断
getchar();
/*这里的getchar不能少,在命令行中用scanf函数做标准输入,只要你是以换行符(也就是回车键)
结束输入并且你不是用scanf读取单个字符,那么这个换行符就会被放到输入缓冲区中。*/
if(!strcmp(a,"pwd"))break; //a数组为pwd则结束输入
gets(str);
len=strlen(s);
if(str[0]=='.') //说明输入为cd ..
{
i=1;
while(s[len-i]!='/') //把最后一级目录所对应的字符串清零直到遇到'/'
{
s[len-i]='\0';
++i;
}
s[len-i]='\0'; //。。。
if(!strlen(s))s[0]='/'; //如果s数组长度为0,则说明cd ..后回到了根目录
}
else if(str[0]=='/')//绝对路径,完全替代
{
strcpy(s,str); //不管'/'后面是什么,一个strcpy轻松搞定
}
else// if('a'<=str[0]&&str[0]<='z')
{
if(len>1)s[len]='/'; //如果当前目录为根目录则不需要加'/'
strcat(s,str); //strcat后接
}
}
printf("%s",s);
return 0;
}
字符串相似度
最长公共子串指给定的两个字符串之间最长的相同子字符串(忽略大小写),最长公共子串长度可用来定义字符串相似度。
现给出两个字符串S1和S2,S1的长度为Len1,S2的长度为Len2,假设S1和S2的最长公共子串长度为LCS,则两个字符串的相似度定义为2LCS/(Len1+Len2)。
例如:S1=”App”,S2=”apple”,S1长度为3,S2长度为5,它们的最长公共子串为”App”,长度为3,则相似度为23/(3+5)=0.75。
现给出两个字符串,请计算它们的相似度结果保留3位小数。
输入说明
输入为两行,分别表示两个字符串S1和S2,每个字符串长度不超过100个字符,所有字符均为可打印字符,包括大小写字母,标点符号和空格。
输出说明
输出两个字符串的相似度,结果四舍五入保留3位小数。
输入样例
App
Apple
输出样例
0.750
#include<stdio.h>
#include<string.h>
#include <math.h>
int main()
{
char s1[101], s2[101], t[101];
int i, j;
float len1, len2, max = 0.0;
int a[100][100] = { 0 };
float similar;
gets(s1);
gets(s2);
len1 = strlen(s1);
len2 = strlen(s2);
for (i = 0; i < len1; i++)
{
for (j = 0; j < len2; j++)
{
if (s1[i] == s2[j] || abs(s1[i] - s2[j]) == 32)
{
if (i != 0 && j != 0)
a[i][j] = a[i - 1][j - 1] + 1;
else a[i][j] = 1;
}
}
}
for (i = 0; i < len1; i++)
{
for (j = 0; j < len2; j++)
{
if (a[i][j] > max) max = a[i][j];
}
}
similar = 2 * max / (len1 + len2);
printf("%.3f", similar);
}
分配宝藏
问题描述
两个寻宝者找到一个宝藏,里面包含n件物品,每件物品的价值分别是W[0],W[1],…W[n-1]。
SumA代表寻宝者A所获物品价值总和,SumB代表寻宝者B所获物品价值总和,请问怎么分配才能使得两人所获物品价值总和差距最小,即两人所获物品价值总和之差的绝对值|SumA - SumB|最小。
输入说明
输入数据由两行构成:
第一行为一个正整数n,表示物品个数,其中0<n<=200。
第二行有n个正整数,分别代表每件物品的价值W[i],其中0<W[i]<=200。
输出说明
对于每组数据,输出一个整数|SumA-SumB|,表示两人所获物品价值总和之差的最小值。
输入样例
4
1 2 3 4
输出样例
0
#include<stdio.h>
int W[201], sum, dp[201][20001]; //[201]是便于将物品从1开始编号
//[20001]同理
int max(int a,int b);
int main(void)
{
int n, i, j, sumA; //假设A得到的永远是较少的那个
scanf( "%d", &n);
for(i = 1; i <= n; i++){ i代指第i个物品
scanf( "%d", &W[i] );
sum += W[i];
}
for(i = 1; i <= n; i++){
if (W[i] > sum/2){ //如果物品某个价值大于总价值的一半,其余物品将给A,不需要再计算
dp[n][sum/2] =sum-W[i];
break;
}
for(j = 1; j <= sum/2; j++){//j指看第i个物品时背包剩余容量
if(W[i] > j) //同样的,物品重量大于背包剩余容量,不偷
dp[i][j] = dp[i-1][j];
else
dp[i][j] = max( dp[i-1][j] , dp[i-1][j-W[i]] + W[i]);
}
}
sumA = dp[n][sum/2];//个人比较喜欢单一出口
printf("%d\n", sum - 2 * sumA);//因为A总是得到较少的那个,不需要再加上绝对值
return 0;
}
int max(int a,int b){
int m = a;
if( a < b) m = b;
return m;
}
分宝物
#include <stdio.h>
//#include <math.h>
int w[5];
int prime[30] = {-1,};
int main(int argc, char const *argv[])
{
int cnt = 1;
for (int i = 2; cnt < 30; i++)
{
bool isprime = 1;
for (int j = 2; j < i&&isprime; j++)
{
if(i%j==0) isprime = 0;
}
if(isprime) {
prime[cnt++] = i;
}
}
int n;
scanf("%d",&n);
int sum = 0;
for (int i = 0; i < 5; i++)
{
w[i] = prime[n+i];
sum += w[i];
}
// printf("%d", 1<<5);
int takeOrNot[5];
int min = 10000;
for (int i = 0; i < 1<<5; i++)
{
int temp = i;
// printf("temp = %d\n",temp);
for (int j = 0; j < 5; j++)
{
takeOrNot[j] = temp%2;
// printf("%d\n",takeOrNot[j]);
temp /= 2;
}
// printf("\n");
int sumA = 0;
for (size_t i = 0; i < 5; i++)
{
// printf("%d ",takeOrNot[i]);
if(takeOrNot[i]) sumA += w[i];
}
// printf("\n");
int delta = (sum - sumA - sumA)>0?(sum - sumA -sumA):-(sum - sumA -sumA);
if(delta<min) min = delta;
}
printf("%d",min);
return 0;
}
元素放置
描述
定义一个一维整形数组num[50],输入正整数m、n(2≤m≤n≤7),输入一个m*n整形矩阵(值小于100),编写函数place()完成矩阵元素S型放置,从小到大排列,使用指针完成地址传递,主函数完成数组输入和输出。
时间限制
1
内存限制
10000
类别
1
输入说明
输入正整数m和n(2≤m≤n≤7),输入一个mn整形矩阵,含mn个元素(值小于100)。
输出说明
格式输出:按行输出处理后的矩阵,S型排列,%3d,每行换行,最后一行不换行。
输入样例
3 3
15 14 21
34 22 37
40 16 50
输出样例
16 15 14
21 22 34
50 40 37
提示
使用指针作形参,实现地址传递,S型排列,%3d,每行换行,最后一行不换行。
#include <stdio.h>
#include <stdlib.h>
int compare(const void*a,const void*b)
{
return(*(int*)a-*(int*)b);
}
void place(int*array, int n, int m, int (*s)[7])
{
int i, j;
for (i = 0; i < m; i++)
{
if (i % 2 == 0)
{
for (j = n - 1; j >= 0; j--)
s[i][j] = *array++;
}
else
{
for (j = 0; j < n; j++)
s[i][j] = *array++;
}
}
}
int main(int argc, char const *argv[])
{
int n,m;
scanf("%d %d",&n,&m);
int s[7][7];
int array[50];
for (int i = 0; i < n*m; ++i)
{
scanf("%d",&array[i]);
}
qsort(array,n*m,sizeof(int),compare);
/*函数功能:qsort()函数的功能是对数组进行排序,数组有nmemb个元素,每个元素大小为size。
参数base - base指向数组的起始地址,通常该位置传入的是一个数组名
参数nmemb - nmemb表示该数组的元素个数
参数size - size表示该数组中每个元素的大小(字节数)
参数(*compar)(const void *, const void *) - 此为指向比较函数的函数指针,决定了排序的顺序。*/
place(array,n,m,s);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
printf("%3d", s[i][j]);
printf("\n");
}
return 0;
}
进制转换
- 问题描述
将十进制数转为其他进制数输出。 - 输入说明
输入两个整数,分别表示十进制下的数字a(0≤a≤(2^31)-1)和进制N(2≤N≤9),整数之间使用空格分隔。 - 输出说明
输出十进制数字a的N进制表示。 - 输入样例
17 7 - 输出样例
23
#include <stdio.h>
int main()
{
int ans[10000], tot = 0, a, n;
scanf("%d%d", &a, &n);
while (a > 0) //使用短除法转换进制。因为短除法的结果需要倒序输出,所以用ans数组存下每步求余数的结果
{
ans[++tot] = a % n;
a /= n;
}
for (int i = tot; i > 0; i--)
printf("%d", ans[i]);
}
螺旋方阵
- 问题描述
螺旋方阵是指一个呈螺旋状的矩阵,它的左上角元素为1,由第一行开始按从左到右,从上到下,从从右向左,从下到上的顺序递增填充矩阵,直到矩阵填充完毕,下图所示是一个5*5阶的螺旋方阵。输入螺旋方阵的阶数N,按行输出该螺旋方阵。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byqaxsAW-1646924572437)(images/1.png)] - 输入说明
输入一个正整数N(1<N<=100)。 - 输出说明
逐行输出N阶螺旋方阵的元素,元素之间用空格分隔。 - 输入样例
6 - 输出样例
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
代码1
#include <stdio.h>
int a[110][110];
const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
//向量(dx[i],dy[i])表示下一步移动的方向,i=0:右,i=1:下,i=2:左,i=3:上
//(0,1)
//(1,0)
//(0,-1)
//(-1,0)
//(x,y)
int main()
{
int n, k = 0, x = 1, y = 1;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[i][j] = -1; //在需要填数字的范围挖个坑
for (int i = 1; i <= n * n; i++)
{
a[x][y] = i; //填写数字
if (a[x + dx[k]][y + dy[k]] >= 0) //如果下一步走到了没挖坑的位置或者已经填上的位置
k = (k + 1) % 4; //那么切换到下一个方向(如果是3方向要换回0方向,所以对4求余数)
x += dx[k], y += dy[k]; //走一步
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
printf("%d ", a[i][j]);
puts("");
}
}
统计小写字母出现的次数
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char str[50];//声明接收字符串的数组
int count[26]={0};//声明统计次数的数组
gets(str);
// for (int i = 0; i < 50; ++i)
// {
// scanf("%c",&str[i]);
// }//输入
// int i = 0;
// while (scanf("%c",&str[i++])==1);
for (int i = 0; i < 50; ++i)
{
int number=str[i]-'a';//字母在ASCALL码地位置
count[number]++;//对应位置计数
}
for(int i=0;i<26;i++)
{
if (count[i]>0)
{
printf("%c %d\n",'a'+i,count[i]);
}
}
return 0;
}
判断字符串回文
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char a[1024];
gets(a);
int count;
count=strlen(a);
char *star=a;
char *end=&a[count-1];
int ret=1;
while(end>star)
{
if (*end!=*star)
{
ret=0;
break;
}else
{
end--;
star++;
}
}
if (ret)
{
printf("yes\n");
}
else
printf("no\n");
return 0;
}
求解星期
已知2021年11月14日为星期天,输入之前的任意一个年份的时间,
求解是星期几。
说明:输入是三个整数,第一个表示年份,第二个表示月份,第三个表示
日期,比如2020年11月5日为2020 11 5,之间以空格隔开;输入是对应英文单词,
是星期4,为Thursday,首字母大写,其余小写。提示,星期一到星期天对应
英文是Monday, Tuesday, Wendnesday, Thursday,Friday, Saturday和Sunday。
输入示例1:
2020 11 5
输出示例1:
Thursday
输入示例2:
2021 6 2
输出示例2:
Wendnesday
#include <stdio.h>
int leap(int year);
int main() {
int day1 = 0, day2 = 0;
int year, month, day;
int interval;
scanf("%d %d %d", &year, &month, &day);
int m[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//流氓算法,不是特别推荐
day1 += day;
for (int i = 1; i < month; ++i) {
day1 += m[i];
}
for (int i = 1; i < year; i++) {
day1 += 365;
if (leap(i))
day1++;
}
// printf("%d\n", day1);
day2 += 14;
for (int i = 1; i < 11; ++i) {
day2 += m[i];
}
for (int i = 1; i < 2021; ++i) {
day2 += 365;
if (leap(i)) {
day2++;
}
}
// printf("%d\n", day2);
interval = day2 - day1;
int judge = interval % 7;
// printf("%d",sum);
switch (judge)
{
case 0:printf("Sunday"); break;
case 1:printf("Saturday"); break;
case 2:printf("Friday"); break;
case 3:printf("Thursday"); break;
case 4:printf("Wendnesday"); break;
case 5:printf("Tuesday"); break;
case 6:printf("Monday"); break;
default:break;
}
return 0;
}
int leap(int year) {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
return 1;
return 0;
}
总结
有问题直接评论留言