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