CSP刷题总结/DFS&BFS

CSP刷题总结

2019

12.a

​ 判断是否是7的倍数或者含有7:

bool isseven(int n){
    if(n%7==0) return true;
    else  {
        for(;n!=0;n/=10){
            if(n%10==7) return true;//类似用数组存储大整数的办法
        }
        //while(n){
        	//if(n%10==7) return true;
        	//	n = n/10;
    	//}
    }
    return false;
}

​ 当然也可以把所有的情况都列出来判断:

bool isseven(int n){
    if(n%7==0) return true;
    else if(n>10&&n<100){
        if(n%10==7) return true;
        else if(n/10==7) return true;
    }
    else if(n>=100&&n<=1142){//注意上限不能只开到999,陷阱!
        if(n%10==7) return true;
        else if(n%100/10==7) return true;
        else if(n/100==7) return true;
    }
    return false;
}

3.a

​ 题目要求输出的时候如果有浮点数要保留一位小数输出:

​ error:不能将``int直接.1f输出,要先转化为double`类型:

if((name[n/2-1]+name[n/2])%2==1) {
          // double c = double(name[n/2-1]+name[n/2])/2;
                printf("%.1f",(name[n/2-1]+name[n/2])/2);
    	// printf(“%.1f,c);
       }

2014

9.c

​ 用了两种方法解决的:第一种遍历字符串:

    bool flag  = false;
    int i,j;
	//其中ans是搜索对象,name是Hello
	//由题意当len1<len return false;故min = len
    for(i = 0;i<len1;i++){
        //for(j = 0;j<len;){
            j = 0;
            if(ans[i]==name[0]){
                int same = 0;
                while(ans[i]==name[j]&&i<len1&&j<len) {
                    i++;
                    j++;
                    same++;
                }
                if(j!=len){
                    //j = 0;
                    i = i-same;//注意不是i=0
                    //flag = false;
                    //break;
                }
                else if(j==len){
                    flag = true;
                    break;
                    //return true;
                }

            //}
            //else j++;

        }
        //if(flag) break;
    }
    if(!flag)
        return false;
    else return true;
}
int main(){
    char s1[100][100],s2[100][100];
    strcpy(s1,s2);
    
}

​ 这种方法类似于PATA1084:给两个字符串,判断在第一个字符串中有哪些字符没有在第二个字符串中出现(不区分大小写)

int main(){
    char str1[100],str2[100];
    bool hashtable[128] =  {false};
    gets(str1);
    gets(str2);
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    for(int i = 0;i<len1;i++){
        int j;
        char c1,c2;
        for(j = 0;j<len2;j++){
            c1 = str1[i];
            c2 = str2[j];
            if(c1>='a'&&c1<='z') c1-=32;
            if(c2>='a'&&c2<='z') c2-=32;
            if(c1==c2) break;
        }
        if(j==len2&&hashtable[c1]==false){
            printf("%c",c1);
            hashtable[c1] = true;
        }
    }
}

思路都是一样的:双重循环,然后根据最后的jlen的关系判断是否找到,否则及时break;

第二种思路:用string容器来做:

void exchange(string &s){
    s[i] = s[i]-'A'+'a';
}
int main(){
    cin>>s>>n>>m;
    if(m==0){
        exchange(s);
        for(int i = 0;i<n;i++){
            cin>>ans;
            exchange(ans);
            string temp = ans;
            if(ans.fins(s)!=ans.npos){//注意这个用法,npos的时候为find找不到
                cout<<temp<<endl;
			}
        }
    }
    
}

其他string常用的函数:

1.operator +=:可以直接拼接两个string,特别是输出含有空格的字符串的时候:
    string ans;
    char c
    while(c = getchar()!='\n'){
        ans+=c;
    }
2.compare operator:可以直接利用==,!=,<,>,>=等,比较的是字典序;
3.insert():
    string ans1 = "abcxyz",ans2 = "opq";
    ans1.insert(3,str2);
    ans1.insert(str1.begin()+3,str2.begin();str2.end());//用迭代器
    //输出都是abcopqxyz
4.erase():
    str.erase(s.begin()+4);
    it = str1.find(str2);
    st
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值