《算法笔记》(胡凡)day3 入门模拟(2)

    科技2026-01-28  8

    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; }
    Processed: 0.019, SQL: 10