鱼C论坛

 找回密码
 立即注册
查看: 1044|回复: 18

[已解决]算法

[复制链接]
发表于 2020-12-10 14:44:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
int main()
{
        int n,day1,day2,month1,month2,year1,year2,year3,year4,temp,y,k;
        scanf("%d",&n);
        int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
        int year,month,day;
        day=n%100;
        //day++;
        n=n/100;
        month=n%100;
        n=n/100;
        year=n;
        while(1)
        {
                days[1]=((year%400==0)||(year%4==0&&year%100!=0))?29:28;
                while(month<=12)
                {
                        while(day<=days[month-1])
                        {
                                temp=year;
                                day1=day%10;
                                day2=day/10;
                                month1=month%10;
                                month2=month/10;
                                year1=year%10;
                                year=year/10;
                                year2=year%10;
                                year=year/10;
                                year3=year%10;
                                year=year/10;
                                year4=year;
                                if((temp*10000+month*100+day)==(day1*10000000)+(day2*1000000)+(month1*100000)+(month2*10000)+(year1*1000)+(year2*100)+(year3*10)+year4)
                                        y=temp*10000+month*100+day;
                                year=temp;
                                if((year==(day1*1000)+(day2*100)+(month1*10)+(month2)))
                                {
                                        k=year*10000+month*100+day;
                                        goto A;
                                }
                        }
                        day=1;
                        month++;
                }
                month=1;
                year++;
        }
A:printf("%d\n",y);
        printf("%d\n",k);
        return 0;
}




//我不行了。。。。。。。
最佳答案
2020-12-11 05:06:43
本帖最后由 jitianmoshen 于 2020-12-11 19:15 编辑
严凯 发表于 2020-12-10 20:59
#include 这个我打不开,他说无法打开这个文件


不支持C99的编辑器趁早放弃了, 感觉你每天都有问题啊
#include <stdio.h>
//#include <stdbool.h>
int data_num(int num);
int abcddcba(int num);
int ababbaba(int num);
int runnian(int num);
int main(void)
{
    int num,i, f1 = 0, f2 = 0;
    printf("请输入一个日期:");
    scanf("%d",&num);
    for (i = num + 1;i < 100000000;i++)
    {
        if (abcddcba(i) == 1)
        {
            if (data_num(i) == 1 && f1 == 0)
            {
                printf("下一个回文日期是%08d\n",i);      //[b]差点忘了年份前面可能有0[/b]
                f1 = 1;
            }
        }
        if (ababbaba(i) == 1)
        {
            if (data_num(i) == 1)
            {
                printf("下一个ABABBABA型回文日期是%08d\n",i);    //[b]差点忘了年份前面可能有0[/b]
                f2 = 1;
            }
        }
        if (f1 && f2)
            break;
    }
    return 0;
}
int data_num(int num)
{
    int year,month,day;
    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    year = num / 10000;
    month = num % 10000 / 100;
    day = num % 100;
    days[1]=(runnian(year))?29:28;
    if (month > 0 && month <= 12)
    {
        if (day > 0 && (day <= days[month - 1]))
            return 1;
        else
            return 0;
    }
    else
        return 0;
}
int runnian(int num)
{
    if ((num % 400 == 0)||(num % 4 == 0 && num % 100 != 0))
        return 1;
    else
        return 0;
}
int abcddcba(int num)
{
    int a1,b1,c1,d1,d2,c2,b2,a2;
    a1 = num / 10000000;
    b1 = num / 1000000 % 10;
    c1 = num / 100000 % 10;
    d1 = num / 10000 % 10;
    d2 = num / 1000 % 10;
    c2 = num / 100 % 10;
    b2 = num / 10 % 10;
    a2 = num % 10;
    if (a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2)
        return 1;
    else
        return 0;
}
int ababbaba(int num)
{
    int a,b,c,d,e,f,g,h;
    a = num / 10000000;
    b = num / 1000000 % 10;
    c = num / 100000 % 10;
    d = num / 10000 % 10;
    e = num / 1000 % 10;
    f = num / 100 % 10;
    g = num / 10 % 10;
    h = num % 10;
    if  ((a == c && c == f && f == h) && (b == d && d == e && e == g))
        return 1;
    else
        return 0;
}
20201018162905412.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-10 14:44:50 | 显示全部楼层
打的我想拉稀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 15:42:16 | 显示全部楼层
让你判断回文年,你去判断闰年干哈?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 15:45:26 | 显示全部楼层
因为2月哪个天数不一样啊,防止越界
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 15:46:03 | 显示全部楼层
风过无痕1989 发表于 2020-12-10 15:42
让你判断回文年,你去判断闰年干哈?

大佬,帮我看看,我快不行了,真的无语了,我感觉我这个逻辑上没毛病,就是打印不出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 15:46:35 | 显示全部楼层
风过无痕1989 发表于 2020-12-10 15:42
让你判断回文年,你去判断闰年干哈?

大佬,神兵天降,您真是及时雨啊,哈哈哈哈哈哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 17:22:09 | 显示全部楼层
严凯 发表于 2020-12-10 15:46
大佬,神兵天降,您真是及时雨啊,哈哈哈哈哈哈哈哈

我没有时间帮你写哟,刚才回完的帖子,就有事离开了
我提醒你一下,今年之前的不必去算的话,日期最大也就是29号,回过来就是9200年,好像题目也没要求你算到那里去,题目在说百年一遇,所以,日期定到21、22、23号足够了,这也就跟闰年不闰年,一点关系都没有了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 17:35:11 | 显示全部楼层
#include <stdio.h>
#include <stdbool.h>
bool data_num(int num);
bool abcddcba(int num);
bool ababbaba(int num);
bool runnian(int num);
int main(void)
{
    int num,i, f1 = 0, f2 = 0;
    printf("请输入一个日期:");
    scanf("%d",&num);
    for (i = num;;i++)
    {
        if (abcddcba(i))
        {
            if (data_num(i) && f1 == 0)
            {
                printf("下一个回文日期是%d\n",i);
                f1 = 1;
            }
        }
        if (ababbaba(i))
        {
            if (data_num(i))
            {
                printf("下一个ABABBABA型回文日期是%d\n",i);
                f2 = 1;
            }
        }
        if (f1 && f2)
            break;
    }
    return 0;
}
bool data_num(int num)
{
    //12345678
    int year,month,day;
    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    year = num / 10000;
    month = num % 10000 / 100;
    day = num % 100;
    days[1]=(runnian(year))?29:28;
    if (month > 0 && month <= 12)
    {
        return  (day > 0 && (day <= days[month - 1]));
    }
    else
        return false;
}
bool runnian(int num)
{
    return  ((num % 400 == 0)||(num % 4 == 0 && num % 100 != 0));
}
bool abcddcba(int num)
{
    // 1  2  3  4  5  6  7  8
    //a1 b1 c1 d1 d2 c2 b2 a2
    int a1,b1,c1,d1,d2,c2,b2,a2;
    a1 = num / 10000000;
    b1 = num / 1000000 % 10;
    c1 = num / 100000 % 10;
    d1 = num / 10000 % 10;
    d2 = num / 1000 % 10;
    c2 = num / 100 % 10;
    b2 = num / 10 % 10;
    a2 = num % 10;
    return (a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2);
}
bool ababbaba(int num)
{
    //12122121
    //abcdefgh
    int a,b,c,d,e,f,g,h;
    a = num / 10000000;
    b = num / 1000000 % 10;
    c = num / 100000 % 10;
    d = num / 10000 % 10;
    e = num / 1000 % 10;
    f = num / 100 % 10;
    g = num / 10 % 10;
    h = num % 10;
    return  ((a == c && c == f && f == h) && (b == d && d == e && e == g));
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 19:51:54 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-12-11 19:13 编辑
#include <stdio.h>

int main()
{
        int i, k = 1, n, m0, m1, m2, m3, m4, m5, m6, m7;
        scanf_s("%d", &n);
        printf("\n");
        for (i = n + 1;i < 21211213;i++)
        {
                m0 = i / 10000000;
                m1 = (i - 10000000 * m0) / 1000000;
                m2 = (i - 10000000 * m0 - 1000000 * m1) / 100000;
                m3 = (i - 10000000 * m0 - 1000000 * m1 - 100000 * m2) / 10000;
                m4 = (i - 10000000 * m0 - 1000000 * m1 - 100000 * m2 - 10000 * m3) / 1000;
                m5 = (i - 10000000 * m0 - 1000000 * m1 - 100000 * m2 - 10000 * m3 - 1000 * m4) / 100;
                m6 = (i - 10000000 * m0 - 1000000 * m1 - 100000 * m2 - 10000 * m3 - 1000 * m4 - 100 * m5) / 10;
                m7 = i % 10;
                if ((m4 == 0 && (m5 > 0 && m5 <= 9)) || (m4 == 1 && m5 <= 2))
                {
                        if (m0 == m7 && m1 == m6 && m2 == m5 && m3 == m4 && k == 1)  // 只输出第一个回文年日期
                        {
                                printf("%d%d%d%d%d%d%d%d\n", m0, m1, m2, m3, m4, m5, m6, m7);
                                k++;  // 后面的回文年日期不输出
                        }
                        if (m0 == m7 && m1 == m6 && m2 == m5 && m3 == m4 && m0 == m2 && m1 == m3 && m0 != m1)
                        {
                                printf("%d%d%d%d%d%d%d%d\n", m0, m1, m2, m3, m4, m5, m6, m7);  // 输出 ABABBABA 型回文年日期
                        }
                }
        }
        printf("\n");
        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 20:59:21 | 显示全部楼层

#include <stdbool.h>这个我打不开,他说无法打开这个文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 21:02:48 | 显示全部楼层
风过无痕1989 发表于 2020-12-10 17:22
我没有时间帮你写哟,刚才回完的帖子,就有事离开了
我提醒你一下,今年之前的不必去算的话,日期最大也 ...

今天没时间了,只有明天想了,唉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 05:06:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jitianmoshen 于 2020-12-11 19:15 编辑
严凯 发表于 2020-12-10 20:59
#include 这个我打不开,他说无法打开这个文件


不支持C99的编辑器趁早放弃了, 感觉你每天都有问题啊
#include <stdio.h>
//#include <stdbool.h>
int data_num(int num);
int abcddcba(int num);
int ababbaba(int num);
int runnian(int num);
int main(void)
{
    int num,i, f1 = 0, f2 = 0;
    printf("请输入一个日期:");
    scanf("%d",&num);
    for (i = num + 1;i < 100000000;i++)
    {
        if (abcddcba(i) == 1)
        {
            if (data_num(i) == 1 && f1 == 0)
            {
                printf("下一个回文日期是%08d\n",i);      //[b]差点忘了年份前面可能有0[/b]
                f1 = 1;
            }
        }
        if (ababbaba(i) == 1)
        {
            if (data_num(i) == 1)
            {
                printf("下一个ABABBABA型回文日期是%08d\n",i);    //[b]差点忘了年份前面可能有0[/b]
                f2 = 1;
            }
        }
        if (f1 && f2)
            break;
    }
    return 0;
}
int data_num(int num)
{
    int year,month,day;
    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    year = num / 10000;
    month = num % 10000 / 100;
    day = num % 100;
    days[1]=(runnian(year))?29:28;
    if (month > 0 && month <= 12)
    {
        if (day > 0 && (day <= days[month - 1]))
            return 1;
        else
            return 0;
    }
    else
        return 0;
}
int runnian(int num)
{
    if ((num % 400 == 0)||(num % 4 == 0 && num % 100 != 0))
        return 1;
    else
        return 0;
}
int abcddcba(int num)
{
    int a1,b1,c1,d1,d2,c2,b2,a2;
    a1 = num / 10000000;
    b1 = num / 1000000 % 10;
    c1 = num / 100000 % 10;
    d1 = num / 10000 % 10;
    d2 = num / 1000 % 10;
    c2 = num / 100 % 10;
    b2 = num / 10 % 10;
    a2 = num % 10;
    if (a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2)
        return 1;
    else
        return 0;
}
int ababbaba(int num)
{
    int a,b,c,d,e,f,g,h;
    a = num / 10000000;
    b = num / 1000000 % 10;
    c = num / 100000 % 10;
    d = num / 10000 % 10;
    e = num / 1000 % 10;
    f = num / 100 % 10;
    g = num / 10 % 10;
    h = num % 10;
    if  ((a == c && c == f && f == h) && (b == d && d == e && e == g))
        return 1;
    else
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-11 18:50:12 | 显示全部楼层
jitianmoshen 发表于 2020-12-11 05:06
不支持C99的编辑器趁早放弃了, 感觉你每天都有问题啊

我们手里面都没有编译器,我这个编译器还是老师发给我们的。这个就vc++2010学习版。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 18:50:40 | 显示全部楼层
我前面说你这题的答案有错,是因为两个原因:
1、答案只给了两个输出,而实际有 13 个输出;
2、若题目非要的类型是 ABABBABA  型日期,刚答案的第一个输出就不符合 ABABBABA,而是 ABACCABA
2  0  2  1   1  2  0  2               2  1   2  1  1  2  1  2
A  B  A  C  C  A  B  A               A  B  A  B  B  A  B  A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 18:57:40 | 显示全部楼层
风过无痕1989 发表于 2020-12-11 18:50
我前面说你这题的答案有错,是因为两个原因:
1、答案只给了两个输出,而实际有 13 个输出;
2、若题目非 ...

题目要求输出两个,一个是ABCDDCBA,一个是ABABBABA
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 19:14:59 | 显示全部楼层
jitianmoshen 发表于 2020-12-11 18:57
题目要求输出两个,一个是ABCDDCBA,一个是ABABBABA

那我的程序只要加一个变量 k 即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 19:18:41 | 显示全部楼层
风过无痕1989 发表于 2020-12-11 19:14
那我的程序只要加一个变量 k 即可

92200229
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 19:30:19 | 显示全部楼层
风过无痕1989 发表于 2020-12-11 19:14
那我的程序只要加一个变量 k 即可

你的限制放开到99999999,程序可以算出像54211245,23211232这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-11 19:36:16 | 显示全部楼层
jitianmoshen 发表于 2020-12-11 19:30
你的限制放开到99999999,程序可以算出像54211245,23211232这样的

是的,很多,昨天我输出了几十个,然后才加条件限制的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 10:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表