美团 %7 事后代码C++
发布于 2017-09-14 23:06 2222 次浏览 0 赞 来自 试题交流  

大佬帮忙看一下, 当时有BUG,事后完善的程序。


举例说明:

127 1996 12


模7结果a[i]依此为

1      1     5 

数字长度b[i]依次为

3      4     2

数组c[i][j] 存放 (i * pow(10,j)) % 7 的值,供查询。


127  以 127作为低部分 ,1996 作为高部分,

a[0] + c[b[1]a[0]] = 1 + 6 = 7   ,所以1996127 满足条件,以此类推


12127          : 2 + 3 != 7;

1271996      :   1 + 5 != 7

121996        :   1 + 6 = 7

12712          :   5 + 2 = 7

199612        :   5 + 2 = 7


结果为 4



#include<cstdlib>
#include<cstdio>
#define N 10001
#define M 10

int a[N]; // 每个数 % 7的余数 
int b[N]; // 每个数的位数 100 => 3

long long T[10] ={0,10,100, 1000, 10000, 100000, 1000000, 10000000,100000000,1000000000};

long long c[M][M]; // c[i][j] =( i * pow(10,j) ) % 7

int main(){
    int n = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        int tmp = 0;
        scanf("%d", &tmp);
        a[i] = tmp % 7;   //获取余数
        
        int count = 0;
        while(tmp > 10 ){
            tmp /= 10;
            count++;
        }
            count++;
        b[i] =count;      // 获取数字位数
    }
    
    for(int i=0; i < 10; i++){
        for(int j = 0; j < 10; j++){
            c[i][j] = (i * T[j] ) % 7;
        }
    }
    
    int count = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(i == j)
                continue;
                
            if(a[i] + c[a[j]][b[i]] == 7)
                count++;
        }
    }
    printf("%d\n", count);


    return 0;
}


2 条回复

有个理解错误: 不应该出现127127这种组合.


2017-09-15 11:11
田忌 回复 coder_8AH8V4J5

if( i==j ) continue; 就是来 避免出现这种情况

2017-09-15 18:09
添加回复
回到顶部