NYOJ 975 关于521

题目分析,也许会有人像我一样想不到这个题只是一道字符串处理的题目,其间涉及到了一些字符串函数的运用,以及打表法的使用,代码是借鉴别人的,并稍作了些改动,附代码和一些知识补充。

#include <cstdio>
#include <cstring>
#define MAX 1000000 + 2

int anger[MAX], anger2[MAX];
char str[10];

int strCmp(){
    if(strstr(str, "521")) return 2;
    if(strchr(str, '1') && strchr(str, '2' ) && strchr(str, '5'))
        return 1;
    return 0;
}
int main(){
    int i, j = 1, t;
    for(i = 125; i != MAX; ++i){
        sprintf(str,"%d",i);
        t = strCmp();
        switch(t){
            case 1: anger[i] = anger[i - 1] + 1;
                    anger2[i] = anger2[i - 1]; break;
            case 2: anger[i] = anger[i - 1] + 1;
                    anger2[i] = anger2[i - 1] + 1; break;
            default : anger[i] = anger[i - 1];
                    anger2[i] = anger2[i - 1]; break;//打表法
        }
    }
    while(scanf("%d%d", &i, &t) == 2)
            printf("Case %d:%d %d\n", j++, anger[t] - anger[i - 1],
                    anger2[t] - anger2[i - 1]);
    return 0;
}

一些用到的字符串的基本知识总结
一、strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
二、strchr函数原型:extern char *strchr(const char *s,char c);查找字符串s中首次出现字符c的位置。
三、(1)’\0’ 是字符串的结束符,任何字符串之后都会自动加上’\0’。
(2)’\0’是C++中字符串的结尾标志,存储在字符串的结尾。比如char cha[5]表示可以放4个字符的数组,由于c/c++中规定字符串的结尾标志为’\0’,它虽然不计入串长,但要占内存空间,而一个汉字一般用两个字节表示,且c/c++中如一个数组cha[5],有5个变量,分别是 cha[0] , cha[1] , cha[2] , cha[3] , cha[4] , 所以cha[5]可以放4个字母(数组的长度必须比字符串的元素个数多1,用以存放字符串结束标志’\0’)或者放2个汉字(1个汉字占2个字节,1个字母占一个字节),cha[5]占5个字节内存空间。
四、如何不使用sprintf函数将整型转化为字符串
void intToString(int n){
int i = 0, t;
while(n){
str[i++] = n % 10 + ‘0’;
n /= 10;
}
str[i] = ‘\0’;
//注意是倒置的
}
五,strcat连接两个字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值