7整除 这个题对C++的来说是个坑,除非真大佬
发布于 2017-09-14 21:31 3066 次浏览 0 赞 来自 试题交流  

大数+去重,去重可以,但是这个大数的整除能把人弄死

9 条回复

Java 好歹还有个bigInteger 之类的... c++ 屁都么

2017-09-14 21:35

我是C++大佬,我随手一写,没有保存,没有编译。

不喜勿喷。

为什么要在意大数?每个数就是mod 7和位数两个特点,统计数量就可以了。

为什么要去重?都说了是所有情况中有几个数。

例如

2

7 7

这个例子,输出应该是2,我认为不用去重。

#include <cmath>
#include <iostream>
#include <cstring>

using namespace std;

int main(){
    int n,a,b;
    int d[7][7][12]={0};
    int num[7][12]={0};
    int mo[7]={1,3,2,6,4,5,1};
    for(int i=0;i<7;i++)
        for(int j=0;j<7;j++)
            for(int k=1;k<12;k++){
                int t=i*mo[k%6]+j;
                if(t%7==0)
                    d[i][j][k]=1;
                else
                    d[i][j][k]=0;
            }
    while(cin>>n){
        memset(num,0,sizeof(num));
        for(int i=0;i<n;i++){
            cin>>a;
            b=(int)log10((double)a)+1;
            a%=7;
            num[a][b]++;
        }
        int res=0;
        for(int i=0;i<7;i++)
            for(int j=0;j<7;j++)
                for(int k=1;k<12;k++){
                    if(d[i][j][k]){
                        if(i!=j){
                            int sum=0;
                            for(int l=1;l<12;l++)
                                sum+=num[i][l];
                            res+=(num[j][k]*sum);
                        }
                        else{
                            int sum=0;
                            for(int l=1;l<12;l++)
                                sum+=num[i][l];
                            sum--;
                            res+=(num[j][k]*sum);
                        }
                    }
                }
        cout<<res<<endl;
    }
}


2017-09-14 21:36
3

首先 我没去重, 但是这样只是提供你一个string 到 long long快速转换的方式。

然而这样的代码没有AC。。。我想哭的心都有~~!

可能会有其他简单方法吧,看到其他人的代码很多都是暴力方法。



#include<iostream>

#include<sstream>

#include<string>

using namespace std;


int main()

{

int n;

cin >> n;

string *x = new string[100001];

long long count = 0;

for (int i = 1; i <= n; i++)

cin >> x[i];


for (int i = 1; i != n; i++)

{

stringstream ss;

stringstream ss2;

string tmp;

string tmp2;

long long t;

long long t2;

for (int j = i + 1; j <= n; j++)

{


tmp = x[i] + x[j];

ss << tmp;

ss >> t;

if (t % 7 == 0)

count++;

tmp2 = x[j] + x[i];

ss2 << tmp2;

ss2 >> t2;

if (t2 % 7 == 0)

count++;

}


}

cout << count << endl;

system("pause");

return 0;

}


2017-09-14 22:00

用C++写了一遍,过10%,换了下java,来大佬,看看能过多少







package demo1;


import java.util.Scanner;


public class Test {


public static void main(String[] args) {

     int length = 0;

int i;

int sum=0;

int x;

String s;

       Scanner scanner = new Scanner(System.in);

       Scanner scanner1 = new Scanner(System.in);

       length = scanner.nextInt();


       int[] intArray = new int[length];

  for( i=0;i<length;i++){

  intArray[i]=scanner1.nextInt();

  

  }

  for( i=0;i<length;i++){

 for(int j=0;j<length;j++)

 { if(i==0 && j==0)

    { }

     else{

 s=String.valueOf(intArray[i])+intArray[j]+"";

 x = Integer.valueOf(s).intValue();    

 if(x%7==0)

 {sum++;

 System.out.println(x);

 }

  

 }

 

 }

  }

  System.out.println(sum);


}


}


2017-09-14 22:02
1
coder_F73CJpXA 回复 coder_WGNNSZWP

我也是这么写的 10%很尴尬 j不能等于n把 另外这种方法会超时

2017-09-14 22:26
coder_WGNNSZWP 回复 coder_F73CJpXA

数组下标从一开始写的

2017-09-14 22:35
coder_FBGN8Y45 回复 acmcoderbg5BgqHJ

同10

2017-09-14 22:55

这题其实根本不需要考虑大整数,直接考虑mod 7就可以

C++ 100%:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int a[100005],f[11][7],b[11];
int getlen(int x)
{
    int res = 0;
    for (;x > 0;x /= 10,res ++);
    return res;
}
int main()
{
    scanf("%d",&n);
    for (int i = 1;i <= n;i ++)
        scanf("%d",&a[i]);
    memset(f,0,sizeof(f));
    b[0] = 1;
    for (int i = 1;i <= 10;i ++)
        b[i] = b[i - 1] * 10 % 7;

    for (int i = 1;i <= n;i ++)
    {
        f[getlen(a[i])][a[i]%7] ++;
    }

    long long ans = 0;
    for (int i = 1;i <= n;i ++)
    {
        int k = getlen(a[i]);
        for (int j = 1;j <= 10;j ++)
        {
            ans += f[j][(7 - ((a[i] % 7) * b[j] % 7)) % 7];
            if (k == j && ((a[i] % 7) * b[j] + a[i]%7)%7 == 0) ans --;
        }
    }

    cout << ans;
}


2017-09-15 00:30
1

http://paste.ubuntu.com/25537252/

暴力O(n*7*9),大约是1e7,对于能跑1e9的机器来说,毛毛雨

2017-09-15 08:22
1
添加回复
回到顶部