赞
踩
哥德巴赫猜想提出:
任一个大于2的偶数,都可以表示为两个素数之和。
根据哥德巴赫猜想,本文运用R进行验证。
***缺点:*只能进行判断,且只能单个数字地进行,不可批量筛选
p<-primes(10)#直接输入数字进行判断
运用基本的计算方法对筛选素数,与求和。
***缺点:*计算迭代次数过多,数值越大,时间需花费越多。
#找100之间的素数 a<-0 #1不是素数,所以n从2开始跑 newdata=c()#创建一个空表 n<-2 while (n <= 100){####如果要改个数,就改这里和下面同样四个井号键的地方,保持一致 f<-0 i<-2 #当能被整除等于0,结果不为素数 while (i < (n-1)){ if (n%%i==0){ f=1 break } i <- i+1 } if (f == 0){ newdata=rbind(newdata,n)#每一次循环的数据结果放在表中 print(n) a <- a+1 } n <- n+1 } paste("100之间的素数有" ,a) qsg<-newdata[1:3,]#显示数据表的前三行 print(qsg) fix(sendata)#更改数据表的变量名,要先运行一遍程序,在缓存库中有sendata之后,再执行该操作 #把所有偶数划分为一对相加素数 n2=4 b<-length(newdata[,1]) sendata=c() repeat{ for (k in 1:b) { x<- newdata[k,1] for (j in 1:b){ y<- newdata[j,1] f=x+y c<-c(x,y,f) sendata=rbind(sendata,c) j<- j+1 } k<-k+1 } newsendata <- sendata[!duplicated(sendata[,3]),]#提取唯一行 n3<- length(newsendata[,1]) for(r in 1:n3){ if(newsendata[r,3] == n2){ m<- newsendata[r,] sy<- list(m) print(paste("1000以内的偶数被分解为两素数之和分别是:",sy)) } } n2<- n2+2 if(n2>100){####如果要改个数,就改这里和上面同样四个井号键的地方,保持一致 break } }
学习点:
R语言中的三种循环方式:
循环结构 | 意义 |
---|---|
for循环 | 也称“计数循环”,比较简明 |
while循环 | “当型循环” ,先判断,后执行 |
repeat循环 | “直到型循环”,先循环,后判断 |
sushu <- function(x){
ifelse(0 %in% c(x %% c(2:ceiling(sqrt(x)))),"FALSE","TRUE")
}
sushu(17)
install.packages("pracma")#下载pracma包 #若下载了,后续从liabrary开始运行 library(pracma)#应用 p<-primes(1000)#对素数的直接提取 a<-c() for(i in seq(from = 4, to = 1000, by = 2)){#偶数 for(j in p){ if(j<=i/2 && isprime(i-j) ){ ss<-c(j,i-j) #ss就是分解偶数为两个素数的素数对 a<-rbind(a, ss) h<- a[,1]+a[,2]#计算两素数之和 solution<-cbind(a[,1:2],h) } } } print(solution)
a<-rbind(a, ss)处延申学习
如果在进行数据接续排列的时候,也可以用append,即a<-append(a, ss)
区别:
注意:在使用rbind()、cbind()时,注意要事先定义好一个矩阵,在循环迭代的过程中对矩阵进行赋值。如果循环迭代过程中有cbind,会导致循环中反复创建矩阵,是非常耗费时间与运行速度的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。