今天下午3点答了搜狗的笔试题目,总体感觉还不错,有一道编程编程题目,并没有做到100%全过,下来有时间补上,求距离之和,题目定义两个大于2的偶数之间的距离,为这两个数之间质数的个数,从小到大输入n个大于2的偶数,输出所有两两之间距离的总和。
样列输入: 第一行代表输入偶数的个数
3
4
6
12
样例输出:
6
刚开始拿到这个题目自己第一感觉就是先开辟一个额外的数组,用来存储相邻偶数之间的质数个数,用上面的列子来说,我开辟b[2]的数组,4-6之间质数个数为1, b[0] = 1,在6-12之间质数个数为2,b[2] =2,因此最后总的个数就是6,因为是凉凉之间,1 + 2 +(1 + 2) = 6;
其实这个用枚举特别难算,自己弄了好长时间,半天找规律,卡边界条件,太复杂,太麻烦,比如有
3个偶数A,B,C, count = AB + AC + BC = 2AB + 2BC;
4个偶数A , B , C, D count = AB + AC + AD +BC + BD + CD = 3AB + 4BC + 3CD;
随着偶数的增多,我真的感觉很烦,然后用了很巧妙的办法,三层循环不让自己找规律了,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//代码没有时间写完了,思路就是申请一个额外数组,存储两两之间的质数的和,最后在重新遍历一次b数组
int main()
{
int i = 0;
int j = 0;
int n = 0;
int m = 0;
int k = 0;
int *a= NULL;
int *b = NULL;
int count = 0;
scanf("%d",&n);
a = (int *)malloc(sizeof(int) * n);
b = (int *)malloc(sizeof(int) * (n - 1));
memset(b,0x00,sizeof(int) * (n-1));
for(i = 0; i < n; i++){
scanf("%d",&a[i]);
}
for(i = 0; i < n; i++){
for(j = a[i]; j < a[i+1]; j++){
for(k = 2; k < j; k++){
if(j % k == 0){
break;
}
}
if(k == j ){
b[m]++;
}
//printf("%d\n",b[i]);
}
m++;
}//end for
for(k = 0; k < n - 1; k++){
for(i = k; i < n -1; i++){
for(j = k; j <= i; j++){
count += b[j];
}
}
}//end for
printf("count = %d\n",count);
return 0;
}
代码运行结果 1:
代码运行结果 2: