回 帖 发 新 帖 刷新版面

主题:[原创]菜鸟问题 请教一下

哥德巴赫猜想:将一个奇数拆分成三个素数之和。
要求:素数按从小到大且是最小的两个素数与另一个素数组合
如:15=2+2+11
15=3+5+7等,程序要求只输出前一种拆分方法。
样例: 
输入:15
输出:15=2+2+11
 
要求:用子程序实现判素数


我编的是

 var m,n,i,j:integer;
 function ss(x:integer):integer;
 var k,f:integer;
 begin
     f:=1;
     for k:=2 to trunc(sqrt(x)) do
        if x mod k=0 then begin
                                f:=0;
                                break;
                          end;
     ss:=f;
 end;
 begin
        read(n);
        m:=n;
        for i:=2 to m-1 do
            if ss(i)+ss(m-i)=1 then if ss(i)=0 then
                                        begin
                                                for j:=2 to i-1 do
                                                    if ss(j)+ss(i-j)=2 then
                                                        begin
                                                              writeln(n,'=',m-i,'+',j,'+',i-j);
                                                              exit;
                                                        end;
                                        end
                                     else
                                         begin
                                                for j:=2 to m-i-1 do
                                                    if ss(j)+ss(m-i-j)=2 then
                                                        begin
                                                              writeln(n,'=',i,'+',j,'+',m-i-j);
                                                              exit;
                                                        end;
                                         end;
 end.




答案有的对有的错,请大虾在原题上修改并跟帖发送,菜鸟感谢不已!!!

回复列表 (共16个回复)

沙发

各位,快回啊!···

板凳

错在哥德巴赫,说明他的猜想是错的撒.

PS:我也菜,什么是素数?

3 楼

素数就是质数,同志!!!
哥德巴赫猜想是对的,你不用怀疑

4 楼

ss(j)+ss(i-j)=2
为什么这些加起来就是n,还有你不会编个两重循环再编个三重循环来做?你这样烦不烦?

5 楼

有一个数是素数,一个SS就为1。ss(j)+ss(i-j)=2就说明两个都是素数。
在之前,判断到M-I为素数,然后就把I分成两个素数的和,而M-J加I是N,那M-J,J,I-J加起来就也是N了。
还有“编个两重循环再编个三重循环来做”是什么意思?请说明白点。

6 楼

for i=先穷举数 do
   for j=再穷举素数 do
    ...
     if 判断=T then Write
   ...

7 楼

如果用穷举
   可以做个素数表,然后再根据表来凑数,
    效率会比较高一点 
     O(n)

8 楼


program tt;
 const maxn=10;
  var dd:array[1..maxn] of integer;
    d,a,n,i,j,z,k:integer;
  procedure t(i:integer);{n以内的质数按从小到大的顺序存入dd}
    begin
          for a:=2 to trunc(sqrt(i)) do
        if i mod a=0 then
        exit;
           dd[k]:=i;
            k:=k+1;
    end;
  procedure ttt;{n等于三个质数的和}
   begin
    for i:=1 to k do
     for j:=1 to k do
      for z:=1 to k do
       if dd[i]+dd[j]+dd[z]=n then
         begin
           writeln( n,'=',dd[i],'+',dd[j],'+',dd[z]);
           exit;
         end;
    end;
  begin
   readln(n);
   dd[1]:=2;k:=2;
   for d:=3 to n do
   t(d);
  ttt;
  end.
做完了,好不好就看你怎么说了.
[em9][em9][em9][em9][em9][em1]

9 楼

帮你把题目补充一下,是非质数的奇数,不然的话3,5,13.....这些你怎么用3个质数加呀?

10 楼


你先给那个奇数减去一个数3;
这样就相当于求一个偶数可以分解成两个素数之和了啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册