1492.破译时间密码


时间限制: 1000 MS          内存限制: 65536 K
        
提交数: 462 (0 users)          通过数: 205 (194 users)


问题描述
截获了一串敌军的密码字符串,其中包含2013年中某个重要的时间(某月某日),需对其破解翻译。字符串中包含数字和其他字符,删除其中的非数字字符,得到一个数字字符串,记为整数N,并按照如下公式计算:Q =(N*3) MOD  1131 + 101 ,M = Q /100,D = Q MOD 38,其中MOD表示取余运算。计算得到的M、D均为整数,M表示月份,D表示日。判断翻译后的日期(某月某日)是否正确,若翻译结果正确,则显示翻译后的日期(某月某日),若翻译结果不对,则可能是截获的密码串有误,给出提示信息“input error!”。例如:若计算后的M = 9,D = 12,则输出9月12日,若计算后的M = 10,D = 32,则输出“input error!”(因为不存在10月32日)。


输入格式
一行一个字符串,文本长度<=1000。


输出格式
第一行为:整数N、Q、M、D(分别以一个空格间隔)
第二行为:翻译后的日期


样例输入
I like 3this gam4e and this i12s just a test.
http1://ww1w.google.c4om.hk7


样例输出
3412  158  1  6
1月6日
1147  149  1  35
input error!


来源

xmu

#include <stdio.h>
#include <stdlib.h>

const int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main()
{
    char text[1005] = { 0 };
    char cipher[20] = { 0 };
    int ptr_cipher, ptr_text;
    int n, q, m, d;

    while (fgets(text, 1005, stdin))
    {
        ptr_cipher = 0;
        for (ptr_text = 0; text[ptr_text]; ++ptr_text)
        {
            if ('0' <= text[ptr_text] && text[ptr_text] <= '9')
                cipher[ptr_cipher++] = text[ptr_text];
        }
        n = atoi(cipher);
        q = (n * 3) % 1131 + 101;
        m = q / 100;
        d = q % 38;
        printf("%d %d %d %d\n", n, q, m, d);
        if (1 <= m && m <= 12 && 0 < d && d <= days[m])
            printf("%d月%d日\n", m, d);
        else
            printf("input error!\n");
    }

    return 0;
}