啊啊啊啊啊啊我就不信了想不明白
1.1 判断能否被已知的素数整除——分解最小公因数
步骤:1,设置数组,记录素数,初始化为{2}
2,设置函数,用以检验一个数X能否整除比他小的全部素数【能,就不是素数,不能,是素数,但是!!数组内的素数一开始只有2,所以,如果输入的X不是3的话,会出现一种情况:数组的素数不是全部比X小的素数,比如9整除2不行,但是能整除3,所以9不是素数】
所以,数组内最大的素数应该,大于等于X的平方才是全的
————折回来!一个数平方之后,位数就是之前的两倍,所以!!!!数组中最大的素数,比如说181,那么!!!足够验证181的平方也就是32761以下的数字是不是素数!?2的平方是4,数组在初始状态下,只能验证4以下的数字,当3计入数组的时候,就可以验证9以下的数字
————也就是数组最大的数字是X,小于X的平方的数字都可以直接用整除数组验证!
————所以依次验证扔给函数没有问题,逐步完善号数组之后,要利用数组去检验一个数字是不是数组,小于数组最大值,可以直接查找,小于数组的平方,可以依次除数组,大于就只能先除数组,之后累加,一边验证一边扩充!
我哭死,我终于搞清楚了
3,所以!啊!!!男神的代码不是给他一个数字去验证,只是从小到大到了建立一个100个素数组成的数组!然后输出
娘嘞,终于是想清楚一点了
#include <stdio.h>
int se(int x,int a[],int tt );
int main(void){
const int tt=10;
int a[tt]={2};
int x;
int i=1;//A[0]已经有了
for(x=3;i<tt;x++){
if(se(x,a,tt)){
a[i++]=x;//第一次的时候,A++=1,A=2
}
}
for(i=0;i<tt;i++){
printf("%d\t",a[i]);
if((i+1)%5==0) {
printf("\n");
}
}
return 0;
}
int se(int x,int a[],int tt ){
int ret=1;
int d=0;
for(d=0;d<10;d++){
if(x%a[d]==0){
ret=0;//不是素数
break;
}
}
return ret;
}
非常勉强的思考成果
我终于知道为什么在函数哪里就报错了,只用写A就好了
但是,还是不行,DEV不报错但是出不来结果,报错,只要调试!!!两个都是在函数里面出了问题!!!我就是想知道到底出了什么问题啊啊啊啊!还有!
为什么!!我真的想知道为什么!!!!!!
#include <stdio.h>
int main() {
const int tt = 10;
int a[10] = { 2,3,5,7,11,13,17,19,23,29 };
int ret = 1;
int d = 0;
{
for (d = 0; d < 10; d++) {
printf("%d\t", a[d]);
}
printf("\n");
}
int x = 89;
for (d = 0; d < 10; d++) {
if (x % a[d] == 0) {
ret = 0;//不是素数
break;
}
}
if (ret == 0) {
printf("不是素数");
}
else {
printf("是素数");
}
return 0;
}
我把函数单独拿出来,这样是可以运行的,但是!!!!当我把数组改成
int a[10] = { 2,3,5,7,11,0,0,0,0,0 };的时候!!!!if (x % a[d] == 0) 这一步就会报错了!!!所以出在0不能做除数上!!!
#include <stdio.h>
int main() {
const int tt = 10;
int a[10];
int d = 0;
{
for (d = 0; d < 10; d++) {
a[d] = 2;
printf("%d\t",a[d]);
}
printf("\n");
}
int ret = 1;
int x = 89;
for (d = 0; d < 10; d++) {
if (x % a[d] == 0) {
ret = 0;//不是素数
break;
}
}
if (ret == 0) {
printf("不是素数\n");
}
else {
printf("是素数\n");
}
return 0;
}
好的!!!!
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
做出来了
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
我真的哭死啊啊啊啊啊啊啊啊啊
虽然VS还是夸夸报错!!!但是!!!!!DEV出来了
等我学到清楚VS到底为什么这么幺蛾子的时候,我就要把他的桌面名称改成狗儿子!!!!
是正常的东西
我真的哭死
我真的
我真的
妈妈呜呜呜呜呜呜我想啃老
妈妈我不想努力了
我真的哭了呜呜呜
上代码
#include <stdio.h>
int se(int x, int a[], int tt);
int main(void){
const int tt = 50;
int a[50];
int d = 0;
for (d = 0; d < 10; d++) {
a[d] = 2;
}//很重要的初始化,0不能作为被除数,也不会有很精确的报错,反正小垃圾我只能这么总结
int x;
int i = 1;//A[0]已经有了
for (x = 3; i < tt; x++) {
if (se(x, a, tt)) {
a[i++] = x;//第一次的时候,A++=1,A=2
}
}
for (i = 0; i < tt; i++) {
printf("%d\t", a[i]);
if ((i + 1) % 5 == 0) {
printf("\n");
}
}
return 0;
}
int se(int x, int a[], int tt){
int ret = 1;
int d = 0;
for (d = 0; d < 10; d++) {
if (x % a[d] == 0) {
ret = 0;//不是素数
break;
}
}
return ret;
}
太爽了!!!!
1.2 方向构造素数表
回忆思路:1,一个数组A[25],0-24,索引就表示数字,初始化为1,即初始化全都是素数
2,已知2是素数,从2开始把2的倍数划掉,就是A[2]=1,X%A[X]==0,则A[X]=0;
3,走完2走3,直到X<25,也就是24,刚号走完数组的下标
注意!!!走到4的时候,4已经在2就被证实不是素数了,那么加上一个甄别条件,IF(A[X]==0,则X++,ELSE则又开始划数字
#include<stdio.h>
int main() {
const int num = 25;
int a[25];
int i;
int x = 2;
for (i = 0; i < num; i++) {
a[i] = 1;
}
for (x = 2; x < num; x++) {
if (a[i] == 0) {
x++;
}
else {
int t = x;
do {
t += t;
a[t] = 0;//这里稍微卡了蛮久
} while (t < num);
}
}
int d = 1;
for (d = 1; d < num; d++) {
if (a[d] == 1) {
printf("%d\t", d);
}
}
return 0;
}
完美!!!今天早点睡!!明天早点起
明天拿下二维数组和指针!!!!