CodeForces - 214B——数的倍数的性质

Think:
1题意:输入位数组成元素,求组合后最大的同时是2,3,5的倍数的数
2知识点:
1>同时满足2的倍数和5的倍数的数末位为0
2>满足3的倍数的数各数位累加和是3的倍数
3反思:
1>通过枚举寻找规律的能力需要加强
2>知识点知识面需要扩展
3>代码反思:编程过程中逻辑混淆需要改正,代码实现过程应保持思路的清晰明了;要尝试不断明确思路,提高理解度,进而简化代码长度,简明扼要表现本质
4>心态反思:不要畏惧,遇到困难要迎难而上
4知识拓展:
1>4的倍数的性质:
(1)十位数是奇数且个位数为不是四的倍数的偶数或十位数是偶数且个位数是四的倍数的整数.
(2)若一个整数的末尾两位数能被4整除,则这个数能被4整除,即是4的倍数 .——参考自百度作业帮
2>6的倍数的性质:
1.各位数之和是3的倍数.
2.个位数是偶数.
比如24,各位数相加是6,是3的倍数;个位数是4,是偶数.——参考自百度作业帮
3>7的倍数的性质
若一个整数的个位数字截去,再从余下的数中,减去个位数的2倍,如果差是7的倍数,则原数能被7整除。如果差太大或心算不易看出是否7的倍数,就需要继续上述「截尾、倍大、相减、验差」的过程,直到能清楚判断为止。例如,判断133是否7的倍数的过程如下:13-3×2=7,所以133是7的倍数;又例如判断6139是否7的倍数的过程如下:613-9×2=595 , 59-5×2=49,所以6139是7的倍数——参考自百度作业帮
4>11的倍数的性质
奇数位数之和与偶数位数之和的差能被11整除.
例如:121,(1+1)-2=0,0能11整除.——参考自百度作业帮

vjudge题目链接

以下为Wrong Answer代码——逻辑不清晰导致错误(反映了题目理解不够深入)

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 4;

int a[N], v[N];

int main(){
    int n, i, sum, flag;
    while(~scanf("%d", &n)){
        sum = 0;
        for(i = 0; i < n; i++){
            scanf("%d", &a[i]);
            sum += a[i];
        }
        sort(a, a+n, greater<int>());
        memset(v, 0, sizeof(v));

        flag = 0;
        if(sum%3 == 1){
            for(i = n-1; i >= 0; i--){
                if(a[i]%3 == 1){
                    v[i] = 1;
                    flag = 2;
                    break;
                }
            }
            if(!flag){
                for(i = n-1; i >= 0; i--){
                    if(a[i]%3 == 2){
                        v[i] = 1;
                        flag++;
                    }
                    if(flag == 2)
                        break;
                }
            }
            if(flag == 2)
                flag = 1;
            else
                flag = 0;
        }
        else if(sum%3 == 2){
            for(i = n-1; i >= 0; i--){
                if(a[i]%3 == 2){
                    v[i] = 1;
                    flag = 2;
                    break;
                }
            }
            if(!flag){
                for(i = n-1; i >= 0; i--){
                    if(a[i]%3 == 1){
                        v[i] = 1;
                        flag++;
                    }
                }
                if(flag == 2)
                    break;
            }
            if(flag == 2)
                flag = 1;
            else
                flag = 0;
        }
        else
            flag = 1;
        int cnt = 0;
        for(i = 0; i < n; i++){
            if(!v[i]){
                cnt = 1;
                break;
            }
        }
        if((!cnt) || a[n-1])
            flag = 0;

        if(!flag)
            printf("-1\n");
        else {
            cnt = 0;
            for(i = 0; i < n; i++){
                if(!v[i]){
                    if(a[i]){
                        cnt = 1;
                        printf("%d", a[i]);
                    }
                    else {
                        if(cnt)
                            printf("%d", a[i]);
                        else {
                            printf("%d", a[i]);
                            break;
                        }
                    }
                }
            }
            printf("\n");
        }
    }
    return 0;
}

以下为Accepted代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 4;

int a[N], v[N];

int main(){
    int n, i, sum, flag;
    while(~scanf("%d", &n)){
        sum = 0;
        for(i = 0; i < n; i++){
            scanf("%d", &a[i]);
            sum += a[i];
        }
        sort(a, a+n, greater<int>());
        memset(v, 0, sizeof(v));

        flag = 0;
        if(sum%3 == 1){
            for(i = n-1; i >= 0; i--){
                if(a[i]%3 == 1){
                    v[i] = 1;
                    flag = 2;
                    break;
                }
            }
            if(!flag){
                for(i = n-1; i >= 0; i--){
                    if(a[i]%3 == 2){
                        v[i] = 1;
                        flag++;
                    }
                    if(flag == 2)
                        break;
                }
            }
            if(flag == 2)
                flag = 1;
            else
                flag = 0;
        }
        else if(sum%3 == 2){
            for(i = n-1; i >= 0; i--){
                if(a[i]%3 == 2){
                    v[i] = 1;
                    flag = 2;
                    break;
                }
            }
            if(!flag){
                for(i = n-1; i >= 0; i--){
                    if(a[i]%3 == 1){
                        v[i] = 1;
                        flag++;
                    }
                    if(flag == 2)
                        break;
                }
            }
            if(flag == 2)
                flag = 1;
            else
                flag = 0;
        }
        else
            flag = 1;
        int cnt = 0;
        for(i = 0; i < n; i++){
            if(!v[i]){
                cnt = 1;
                break;
            }
        }
        if((!cnt) || a[n-1])
            flag = 0;

        if(!flag)
            printf("-1\n");
        else {
            cnt = 0;
            for(i = 0; i < n; i++){
                if(!v[i]){
                    if(a[i]){
                        cnt = 1;
                        printf("%d", a[i]);
                    }
                    else {
                        if(cnt)
                            printf("%d", a[i]);
                        else {
                            printf("%d", a[i]);
                            break;
                        }
                    }
                }
            }
            printf("\n");
        }
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值