时间限制: 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;
}