广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 12089 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
翁赐维
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[C/C++][求助] C++程式码问题,1~1000的所有质数
我要写了一个可以印出1~1000所有质数的程式
可是,我发现如果有以下红色地色的程式码他就会印出不是质数的数字
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
 int i,j;
..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



献花 x0 回到顶端 [楼 主] From:台湾台湾宽频 | Posted:2010-01-12 21:20 |
晴云秋月
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x10 鲜花 x120
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

质数的定义:指在一个大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数.
但是看你写的,完全看不出来你在验证是不是质数
我在纸上追踪了一下,

┌────┬────┬────┬────┬────┬──
│     i     │   1   │   2     │   3   │   4     │ 最大的回圈
├────┼────┼────┼────┼────┼
│temp1│   3   │   4     │   5     │   6   │ temp1=temp1+i
├────┼────┼────┼────┼────┼
│   j     │  2~3 │ 2~4   │  2~5 │ 2~6 │ 第二层回圈 j=2~temp1
├────┼────┼────┼────┼────┼
│temp2│ 3%1 │4%2 │ 5%3  │ 6%4 │ 将temp1取余数temp2=temp1%i
├────┼────┼────┼────┼────┼

若后面判断式先不看的话,我只看出来

i=1时,j的回圈跑2次(j=2~3)的 3%1--->不管跑几次,结果,都是0
i=2时,j的回圈跑3次(j=2~4)的 4%2--->不管跑几次,结果,都是0
i=3时,j的回圈跑4次(j=2~5)的 5%2--->不管跑几次,结果,都是1
.
.后面略
.
所以前面回圈架构本身就是错的,          
根本就不用去看后面的if判断式了,
因此跟你标的红字无关,以上针对你写的程式码解说,参考看看吧.


[ 此文章被晴云秋月在2010-01-12 23:49重新编辑 ]


高兴也好,难过也好,
用心的过每一天,
~Just feel my soul~
献花 x0 回到顶端 [1 楼] From:台湾中华电信 | Posted:2010-01-12 23:22 |
翁赐维
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

抱歉,我打错了!!
前面的程式码:
temp2=temp%i应改成temp2=temp1%j才对
这样才有办法用那个数去除以大于1小于那个数的所有整数
抱歉!!
麻烦在帮我看一下,谢谢!!


献花 x0 回到顶端 [2 楼] From:台湾台湾宽频 | Posted:2010-01-13 08:09 |
leacks 手机
个人文章 个人相簿 个人日记 个人地图
小有名气
级别: 小有名气 该用户目前不上站
推文 x8 鲜花 x324
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

用暴力法的话
复制程式
       int num[1000];
       int atemp,btemp,ctemp,i;
       cout<<"1,2,";
       num[0]=2;
    btemp=0;
       atemp=2;
    while(atemp<1000)
            {
                ctemp=0;
                for(i=0;i<=btemp;i++)
                   {
                       if((atemp%num[i])==0)
                         {
                             ctemp=1;
                             break;
                         }
                   }
                if(ctemp==0)
                  {
                      cout<<atemp<<",";
             btemp++;
                      num[btemp]=atemp;
                  }
          atemp++;
            }
 system("pause");

此文章被评分,最近评分记录
财富:50 (by 三仙) | 理由: ^^ 因为您的参与,让程式设计更容易!!


献花 x1 回到顶端 [3 楼] From:台湾台湾基础开发 | Posted:2010-01-14 18:30 |
晴云秋月
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x10 鲜花 x120
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

下面是引用 翁赐维 于 2010-01-13 08:09 发表的 : 到引言文
抱歉,我打错了!!
前面的程式码:
temp2=temp%i应改成temp2=temp1%j才对
这样才有办法用那个数去除以大于1小于那个数的所有整数
抱歉!!
麻烦在帮我看一下,谢谢!!

嗯,那意思就是如下了
┌────┬────┬────┬────┬────┬──
│     i     │   1   │   2     │   3   │   4     │ 最大的回圈
├────┼────┼────┼────┼────┼
│temp1│   3   │   4     │   5     │   6   │ temp1=temp1+i
├────┼────┼────┼────┼────┼
│   j     │ 2~3 │ 2~4   │ 2~5 │ 2~6 │ 第二层回圈 j=2~temp1
├────┼────┼────┼────┼────┼
│temp2│ 3%1 │4%2 │ 5%3 │ 6%4 │ 将temp1取余数temp2=temp1%j
├────┼────┼────┼────┼────┼

大致上你要算是否为质数的的方向是OK的,
不过错在你的判断式,
你判断式为
if(整除)
  则跳出回圈,
else
  印出来.

因为会造成不管对错,都会列印出来,对的会重覆出现,错的也会出现

举个例子,当i=3时,则temp1=5时,在j=2~5的回圈中
5%2=1 ==>印出来
5%3=2 ==>印出来
5%4=1 ==>印出来
5%5=0 ==>跳出回圈
因为从2 开始除,每除一次就印一次,所以会印出3个5

若i=7时,则temp1=9时,在j=2~9回圈中
9%2=1 ==>虽然不为质数,但因为第一个是用去验证,且又没有整除,所以会被印出来
9%3=0 ==>跳出回圈,第二个验证才整除,不过除以2时,就已印出9了

因此,只要是单数,都会被印出至少一个

所以是整个判断式有问题,不是红色字,
给你一个方向,你可以在回圈内用个变数去记录,是否整除,待回圈都除好时,在用此变数去判断
才不会造成重覆印和印出质数来.

以上参考看看


高兴也好,难过也好,
用心的过每一天,
~Just feel my soul~
献花 x0 回到顶端 [4 楼] From:台湾中华电信 | Posted:2010-01-17 21:14 |
晴云秋月
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x10 鲜花 x120
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
  int i,j;
  bool prime; //记录是否为质数的旗标,true:为质数,false:不为质数

  cout << '2'; //先印出2
  for(i=1;i<=998;i++)
  {
      int temp1=2;
      temp1=temp1+i; //由3开始跑
      for(j=2;j<temp1;j++)
      {
        prime=false;   //旗标先设为:false,不为质数
        int temp2;
        temp2=temp1%j; //由2开始除
        if(temp2 == 0) //余数为0则跳出
          break;
        else
          prime=true; //余数不为0时
      }
    if(prime)   //判断整个除完,是不是余数都不为0,则为质数
        cout << temp1; //则印出
    }
    system("pause");
    return 0;
}
帮你加了点东西,因为我没有灌程式,所以无法确定跑不跑的起来

此文章被评分,最近评分记录
财富:50 (by 三仙) | 理由: ^^ 因为您的参与,让程式设计更容易!!


高兴也好,难过也好,
用心的过每一天,
~Just feel my soul~
献花 x1 回到顶端 [5 楼] From:台湾中华电信 | Posted:2010-01-17 21:39 |
翁赐维
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

感谢各位大大的帮忙^^
我已经解决了表情


献花 x0 回到顶端 [6 楼] From:台湾中华电信 | Posted:2010-01-19 23:04 |
su5gsm
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x5
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

#include <stdio.h>
#include <stdlib.h>
/* all prime < a */
int main(void)
{
  int j=3,i=2,prime=1,a;
  printf("input a= ");
  scanf("%d",&a);
  printf("2\n");
  for(j=3;j<=a;j++)
  {
    prime=1,i=2;   //init data      
    for(i=2;i<j;i++) { if (j%i==0) prime=0; }
   
    if (prime==1) printf("%d\n",j);
  }
 
  system("pause");
  return 0;
}


献花 x1 回到顶端 [7 楼] From:局域网对方和您在同一内部网 | Posted:2010-10-28 15:56 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.059014 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言