1、2、3 见day2
前三个常见算法见博客中day2的内容
连接如下
https://blog.csdn.net/weixin_44952817/article/details/108955825
4.日期处理问题
日期处理问题较为复杂,因为涉及到处理平闰年,以及由此产生的二月的天数问题,大小月问题。
1.日期差值
这个问题的解题思路为:
1.分解输入的八位数字,前四位为年份,第五和第六位是月份,第七第八位是日期。
2.小的日期的天数不断+1,超过月份最大日期后,月份+1,超过12月之后,年份+1,一直到两个日期相等,过程中记录天数+1的次数,从1开始累加就可以得到最终的结果。
重点包括:
1.判断年份是平还是闰,根据这个设置每月的天数(主要是二月)。可以借助二维数组实现。
2.分割数字,整除和取余的灵活运用,整除10的n次方(/)是从左侧起,保留n位,对10的n次方取余(%)是从右侧起保留n位。
#include<stdio.h>
int year(int x)//判断闰年还是平年
{
if((x % 4== 0 && x % 100!=0)||( x % 400 ) == 0 )
{
return 1;
}
else
{
return 0;
}
}
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},
{31,31},{30,30},{31,31},{30,30},{31,31}};//用二维数组表示平闰年
int main()
{
int a,b;
int y1,y2,m1,m2,d1,d2;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a>b)
{
int temp;
temp=a;
a=b;
b=temp;
}
y1=a/10000;
y2=b/10000;
m1=a%10000/100;
m2=b%10000/100;
d1=a%100;
d2=b%100;
/*分别求年月日*/
int d=1;//记录结果
while(y1<y2||m1<m2||d1<d2)
{
d1++;
if(d1==month[m1][year(y1)]+1)
{
m1++;
d1=1;
}
if(m1==13)
{
y1++;
m1=1;
}
d++;
}
printf("%d\n",d);
}
return 0;
}
5.进制转换问题
对于一个P进制的数字,如果要转换为Q进制,分为两步:
1.将P进制的数字x转换为十进制的数字y;
对于一个十进制的数字y=d1d2…dn,它可以写成这个形式:
同样的,P进制的数字也可以写成
而这个公式可以通过循环实现:
int y=0,product=1;//product在循环中会不断的乘P,得到 1,p,p^2.....
while(x!=0)
{
y=y+(x%10)*product;//%10是为了获取最右侧一位的数字
x=x/10;//去掉最右侧位的数字
product=product * p;
}
2.将十进制数字y转换为Q进制的数字z
采用“除基数取余数”方法。
例如11转换为2进制数字:
11/2=5…1
5/2=2…1
2/2=1…0
1/2=0…1
结束
余数从后往前输出,即得到1011为11的二进制表示
int z[40],num=0;//z用来保存Q进制的数字Y的每一位,num为位数
do
{
z[num++]=y%Q;
y=y/Q;
} while(y!=0);//商不为0时候循环
D进制的A+B
#include<stdio.h>
int main()
{
int a,b,d;
scanf("%d%d%d",&a,&b,&d);
int e=a+b;
int z[40],num=0;
while(e!=0)
{
z[num++]=e%d;
e=e/d;
}
for(int i=num-1;i>=0;i--)
{
printf("%d",z[i]);
}
return 0;
}
6. 字符串处理
1.回文串问题
#include<stdio.h>
#include<string.h>
int main()
{
char str[255];
gets(str);
int len=strlen(str);
int m;
if(len%2==0)
{
int n=len/2;
for(int i=0;i<n;i++)
{
if(str[i]!=str[len-1-i])
{
printf("NO\n");
break;
}
if(i==n-1)
{
printf("YES\n");
}
}
}
else
{
int n=len/2+1;
for(int i=0;i<n;i++)
{
if(str[i]!=str[len-1-i])
{
printf("NO\n");
break;
}
if(i==n-1)
{
printf("YES\n");
}
}
}
return 0;
}
2.说反话
思路:
1.接收整个字符串后,解析字符串,用字符的二维数组把单词按行存放。(注意,每一行结束用\0);
2.倒序输出字符的二维数组即可;
#include<stdio.h>
#include<string.h>
int main()
{
char str[90];
char str0[90][90];
gets(str);
int len=strlen(str);
int j=0;
int h=0;
for(int i=0;i<len;i++)
{
if(str[i]!=' ')
{
str0[j][h]=str[i];
h++;
}
else
{
str0[j][h]='\0';
j++;
h=0;
}
}
for(int i=j;i>=0;i--)
{
int m=0;
while(str0[i][m]!='\0')
{
printf("%c",str0[i][m]);
m=m+1;
}
printf(" ");
}
return 0;
}