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整除.——参考自百度作业帮
以下为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;
}