pat火星数字 测试点1和4已经对0和13的倍数处理里还是通不过

此刻我在家里喂猪呢 2020-06-03 09:01:15

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n,t1,t2,len, k1, k2;
char *c[13] = { "tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
char *d[13] = {"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };
int k = 0,kk=0,sum = 0;;
char a[10],tmp[10];
scanf("%d",&n);
getchar();
for (int i = 0; i < n; i++)
{
fgets(a,10,stdin);
len = strlen(a);
if (len == 2 && a[0] == '0') printf("tret\n");
else if (a[0] > '0' &&a[0] <= '9')
{
int t = atoi(a);
if (t <= 12)printf("%s\n",c[t]);
else if (t % 13 == 0) printf("%s\n",d[t/13]);
else printf("%s %s\n",d[t/13], c[t % 13]);
}
else
{
if (len == 4 || len == 9) printf("0");
else if (len < 4)
{
a[3] = '\0';
for (int i = 0; i < 13; i++)
{
if (strcmp(a, c[i]) == 0)
printf("%d\n",i);
}
for (int i = 0; i < 13; i++)
{
if (strcmp(a, d[i]) == 0)
printf("%d\n", i*13);
}
}
else
{
for (k1 = 0; k1 < 13; k1++) //计算高三位
{
if (strncmp(a, d[k1], 3) == 0)
{
sum = k1 * 13;
}
}
tmp[3] = '\0';
for ( k2 = 0; k2 < 12; k2++) //计算低三位
{
strncpy(tmp, a + 4, 3);
if (strcmp(c[k2], tmp) == 0&&c[k2]!="tret")
{
sum = sum + k2;
}
}
printf("%d\n", sum);
sum = 0;
}
}
}
while (1);
return 0;
}
...全文
192 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
找到我的原因了 有个for里的数组个数是13,还有就是我不知道strcmp第一个参数的指针可以选位置
自信男孩 2020-06-03
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>



int find_index(const char **str, int len, const char *src)
{
int i;

for (i = 0; i < len; i++)
if (str[i][0] != '\0' && strstr(src, str[i]))
break;
if (i >= len)
return -1;

return i;
}

int main()
{
const char *ones[13] = {
"tret", "jan", "feb", "mar", "apr",
"may", "jun", "jly", "aug", "sep",
"oct", "nov", "dec"
};
const char *tens[13] = {
"", "tam", "hel", "maa", "huh",
"tou", "kes", "hei", "elo", "syy",
"lok","mer","jou"
};
char str[32], *pstr;
int n, i = 0, num, quot, ret;


scanf("%d",&n);
getchar(); //for '\n'

while (i < n) {
fgets(str, 32, stdin);

if (isdigit(str[0])) {
num = atoi(str);
//printf("num = %d\n", num);
if (num >= 169 || num < 0) {
fprintf(stderr, "Input error!\n");
continue;
}
if ((quot = num / 13))
printf("%s ", tens[quot]);
printf("%s\n", ones[num % 13]);
continue;
}
//puts(str);
num = 0;
pstr = str;
ret = find_index(tens, 13, pstr);
if (ret > 0) {
num = ret * 13;
pstr = strstr(str, " ");
}
if (pstr != NULL) {
ret = find_index(ones, 13, pstr);
num += ret;
}
printf("%d\n", num);
i++;
}

return 0;
}

用这个代码吧,上面的代码还有点bug。
自信男孩 2020-06-03
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>



int find_index(const char **str, int len, const char *src)
{
int i;

for (i = 0; i < len; i++)
if (str[i][0] != '\0' && strstr(src, str[i]))
break;
if (i >= len)
return -1;

return i;
}

int main()
{
const char *c[13] = { "tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
const char *d[13] = {"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };
char str[32], *pstr;
int n, i = 0, num, remainder, quot, ret;


scanf("%d",&n);
getchar(); //for '\n'

while (i < n) {
fgets(str, 32, stdin);

if (isdigit(str[0])) {
num = atoi(str);
printf("num = %d\n", num);
if (num >= 169 || num < 0) {
fprintf(stderr, "Input error!\n");
continue;
}
if ((quot = num / 13))
printf("%s ", d[quot]);
printf("%s\n", c[num % 13]);
continue;
}
//puts(str);
num = 0;
pstr = str;
ret = find_index(d, 13, pstr);
if (ret > 0)
num = ret * 13;
//printf("ret1 = %d\n", ret);
pstr = strstr(str, " ");
if (pstr != NULL) {
ret = find_index(c, 13, pstr+1);
//printf("ret2 = %d\n", ret);
num += ret;
}
printf("%d\n", num);
i++;
}

#if 0
int n,t1,t2,len, k1, k2;
const char *c[13] = { "tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
const char *d[13] = {"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };

int k = 0,kk=0,sum = 0;;
char a[32],tmp[32];
scanf("%d",&n);
getchar();
for (int i = 0; i < n; i++)
{
fgets(a,10,stdin);
len = strlen(a);

if (len == 2 && a[0] == '0') printf("tret\n");
else if (a[0] > '0' &&a[0] <= '9')
{
int t = atoi(a);
if (t <= 12)printf("%s\n",c[t]);
else if (t % 13 == 0) printf("%s\n",d[t/13]);
else printf("%s %s\n",d[t/13], c[t % 13]);
}
else
{
if (len == 4 || len == 9) printf("0");
else if (len < 4)
{
a[3] = '\0';
for (int i = 0; i < 13; i++)
{
if (strcmp(a, c[i]) == 0)
printf("%d\n",i);
}
for (int i = 0; i < 13; i++)
{
if (strcmp(a, d[i]) == 0)
printf("%d\n", i*13);
}
}
else
{
for (k1 = 0; k1 < 13; k1++) //计算高三位
{
if (strncmp(a, d[k1], 3) == 0)
{
sum = k1 * 13;
}
}
tmp[3] = '\0';
for ( k2 = 0; k2 < 12; k2++) //计算低三位
{
strncpy(tmp, a + 4, 3);
if (strcmp(c[k2], tmp) == 0&&c[k2]!="tret")
{
sum = sum + k2;
}
}
printf("%d\n", sum);
sum = 0;
}
}
} while (1);
#endif
return 0;
}

供参考~

Re:CCNA_CCNP 思科网络认证 PAT NAT 端口或地址转换 与端口映射======================# 本章课程大纲        公网地址和私网地址        NAT应用场景        静态NAT  :static  地址转换        动态NAT  :dynamic地址转换        PAT        :端口地址转换        端口映射 :port map        在Windows上同时实现的NAT和端口映射 # 私网地址三类 A类:10.0.0.0                                255.0.0.0(1网段) B类:172.16.0.0 -172.31.0.0         255.255.0.0(16网段) C类:192.168.0.0-192.168.255.0  255.255.255.0(255网段) # NAT 的使用场景        NAT的最初的目的是允许把私有IP地址映射到公网地址,以减缓IP地址空间的消耗。        当一个组织更换它的互联网服务提供商ISP,但不想更改内网配置方案时,NAT同样很有用途。        以下是适于使用NAT的多种情况:         企业内网接入Internet节省公网地址         单向访问         大方向:内网访问互联网(互联网上主机不能够访问内网主机)         小方向:同单位实现两个网段之间单向访问(涉密部门能够访问其他部门,反之不可)         增加一个网段          避免在主干路由器增加到这个网段的路由         在Windows上实现的NAT和端口映射 # 网络地址转换的类型        下面介绍一下NAT的三种类型。         静态NAT 是为了在私网地址和公网地址间,允许一对一映射而设计的。         或者IPv4和IPv6之间的转换(典型)         不节省公网地址,故公网地址的利用效率不高,         无任何安全性,外网可以通过公网地址直接攻击内网主机,好像只增加路由器的工作         适用场景类似代理,可以较方便的更换主机,而无需修改路由器的配置         故应用不够广泛...         动态NAT 可以实现映射一个未注册 IP地址到注册IP地址池中的一个注册IP地址。         多对一,或多对多         比较PAT优势:避免被误认为攻击而被封ip地址         不太节省地址,应用不广泛         复用是最流行的NAT配置类型,也被称为端口地址映射(PAT)。         通过使用PAT,可实现上千个用户仅通过一个真实的全球 IP地址连接到Internet。         缺点:增加延迟,消耗路由器性能 # 端口映射(port mapping) 允许Internet上的计算机通过企业路由器的公网IP地址访问到内网的服务器------------------------------------------------         
Re:CCNA_CCNP 思科网络认证 《 综合案例设计_配置高可用企业网络;网络工程课程设计》(可以作为网络专业毕业设计的选题范围,再根据自身情况和学校要求,添加引经据典的描述内容)================================================ # 案例名称:配置高可用企业网络 涉及知识点汇总: 交换机:创建VLAN 和创建干道链路 配置多层交换机:创建VLAN 和干道链路 配置多层交换机:VLAN间路由 配置多层交换机:HSRP(热备路由协议)协议 配置多层交换机:VLAN连接互联网 配置多层交换机:配置PAT功能 配置多层交换机:指定端口变成路由器的物理接口 配置多层交换机:端口跟踪 # 综合案例设计_《网络工程课程设计》涉及知识要点(12项) 子网划分(实用、实际、实在) 架构设计(规划单位/企业整体 网络拓扑图) 逻辑图 实验图 登记表包括 服务器ip地址、 固定主机ip地址、 动态地址网段等规划信息表 配置干道链路 交换机 三层交换机 配置VTP域 客户端 服务器端 将计算机或服务器的接口规划到指定的VLAN中 三层交换实现VLAN间路由 在三层交换上配置跨网段(DHCP中继功能)地址分配 配置静态路由 路由器 三层交换机 配置PAT(端口转换) 配置MAP(端口映射) 配置网络安全 配置基本访问控制列表 配置扩展ACL---------------------------------------                 

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧