1)昨天鸽了一天,这很不好。
2)今天有一道附加题,是求一定范围内素数个数的,给定的范围是50000000,做了试触法和筛选法的尝试(筛选法不是很明白,肯定还可以优化),不过都超限了,代码如下:
#include<stdio.h>
#include<math.h>
int main(void)
{
int n = 0;
scanf("%d", &n);
int count = 0;
for (int i = 1;i <= n;i += 2)
{
int j = 2;
for (j = 2;j <= (int)sqrt(i); j++)
{
if (i == 1)
{
break;
}
if (i % j == 0)
{
break;
}
}
if (j>sqrt(i))
{
count++;
}
}
printf("%d", count);
return 0;
}
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main(void)
{
int n = 0;
scanf("%d", &n);
int* arr;
arr = (int*)malloc(n * sizeof(int));
int count = 0;
int countp = 0;
int countm;
if (n >= 2)
{
count++;
}
for (int i = 3;i <= n;i += 2)
{
arr[count-1] = i;
count++;
}
countm = count;
for (int i = 3;i <= sqrt(n);i += 2)
{
for (int j = 0;j <= count - 1;j++)
{
if ((arr[j] % i == 0) && arr[j] != i)
{
countm--;
arr[j] = 0;
}
}
}
if (n == 2)
{
countp = 1;
}
else
{
for (int i = 0;i <=count;i++)
{
if (arr[i] != 0)
{
countp++;
}
}
}
printf("%d", countp);
return 0;
}
感觉这个问题里面2的存在是最麻烦的,试触法完全是取巧避开了这个问题(不可能输入为1),但是在用筛选的时候就很麻烦,如果不把2放进那个全是奇数的数组内,就要单独讨论2情况;目前感觉问题在筛选得出是素数的数要怎么处理,我把他们设为0,但这样又要重新遍历一次数组(简直疯了。。),这两天再想想怎么办吧。。
3)今天还学了数组指针(本质是指针,指向数组)
int arr[10] = {1,2,3,4,5,6,7,8,9,0}
int (*p)[10] = &arr;
这里正好再复习一次:&arr回取出整个数组的地址,是一个例外(一般数组名就是指针);
sizeof(arr)算全数组大小,sizeof(arr[n])算元素(正好是指针?)大小。