瑞星卡卡安全论坛

首页 » 技术交流区 » 系统软件 » 【讨论】为什么它会出错?
风华正茂 - 2005-7-15 16:54:00
用C++编的一段程序#include <iostream.h>
bool sushu (int x)
{
    int a=0;
    int i;
    bool m;
    for(i=0;i<=x;i++)
        if(x%i==0) a++;

    if (a=2) m=1;
    else m=0;
    return m;
}
void main()
{
    int b;
    cin>>b;
    cout<<sushu(b);
编译后运行会显示非法操作的对话框,,,WHY???
怪物125号 - 2005-7-15 20:29:00
12 % 0 == 非法操作
所以,把for(i=0;i<=x;i++)改为for(i=1;i<=x;i++)

另外再指出一个错误:if (a=2) , 应该为if (a == 2) , 这样的错误,以后少犯了,很难找的
风华正茂 - 2005-7-18 21:23:00
谢了
欧虫 - 2005-7-18 21:37:00
应该可以这样改吧:if(x%i==0) a++;改为if(x%(i+1)==0) a++;
觉得这样更合题意




怪物125号 - 2005-7-19 8:26:00
引用:
【欧虫的贴子】应该可以这样改吧:if(x%i==0) a++;改为if(x%(i+1)==0) a++;
觉得这样更合题意
...........................


这里根本没有什么“题”,由于楼主是这样的for(i=0;i<=x;i++),所以if(x%(i+1)==0) a++;,不但会多算一个 5 % 6 == 0 这样的东西,而且会由于i+1,多出一个加法操作,又慢了一点。

另外,我把楼主的main()改成这样,计算出10000以内的素数。

void main()
{
    int l=GetTickCount();
    for(int i =0; i<=10000;i++)
        if (sushu(i)) cout << i << " ";

    cout << endl << (GetTickCount() -l);
    return;
}
结果耗时1687ms,但我有一个算法只需20ms(我也不知道是多少,因为GetTickCount已经不能准确计时20ms了),如果用于计算100000以内的素数,差别会更加大,呵呵。
欧虫 - 2005-7-19 11:44:00
o!
实在太抱歉了,我只是考虑到把i改了会少运行一次循环,所以就妄下了那样的结论,

现在才看清楚具体,sushu()是判断一个是数是否为素数吧。
如果这样的话改为
bool sushu (int x)
{
int a=0;
int i;
bool m;
int y=根号x;(这里不会表示根号)
for(i=1;i<=y;i++)
if(x%i==0) a++;

if (a=1) m=1;
else m=0;
return m;
}


这样可以吗?
哈哈
因为只是以前开过这课,学会的也只是抄书上的例子,见笑了。通常不太注意效率。
仅此而已。
怪物125号 - 2005-7-19 20:14:00
根号sqr(),减短了循环长度,在算10000以内素数比原来那个算法快5倍,但还是比我的慢10倍,在数更大时会比楼主的算法快更多。

但问题是根号是浮点运算,的确慢,我把楼主的算法加了一行后又比你的算法快了1.5倍(在10000以内时,在50000以内还是慢)。看来根号是个双刃剑。
怪物125号 - 2005-7-19 20:25:00
int knownPrime[100000];
int pos;

BOOL isPrime(int x)
{
    for(int i=1; i<=pos; i++)
    {
        if (x % knownPrime == 0)
            return FALSE;
        if (x <= knownPrime * knownPrime)
            break;
    }
    if (x == 1) return FALSE;

    pos++;
    knownPrime[pos] = x;
    return TRUE;
}
看看我速度飞快的代码,但要从小到大搜索一遍以初始化knownPrime表(搜索的过程也可以用来探索比如100,000内的所有素数,只需0.35秒),然后才能用于判断一个数是否素数

void main()
{
    int l=GetTickCount();
    pos = 1;
    knownPrime[1] = 2;
    for(int i=1;i<=100000;i++)
    {
        if (isPrime(i))
            cout << i << " ";
    }
    cout << endl << "Time:" << (GetTickCount()-l) << endl;
    return;
}
清风阁☆四少 - 2005-7-20 9:27:00
引用:
【怪物125号的贴子】int knownPrime[100000];
int pos;

BOOL isPrime(int x)
{
    for(int i=1; i<=pos; i++)
    {
        if (x % knownPrime == 0)
            return FALSE;
        if (x <= knownPrime * knownPrime)
            break;
    }
    if (x == 1) return FALSE;

    pos++;
    knownPrime[pos] = x;
    return TRUE;
}
看看我速度飞快的代码,但要从小到大搜索一遍以初始化knownPrime表(搜索的过程也可以用来探索比如100,000内的所有素数,只需0.35秒),然后才能用于判断一个数是否素数

void main()
{
    int l=GetTickCount();
    pos = 1;
    knownPrime[1] = 2;
    for(int i=1;i<=100000;i++)
    {
        if (isPrime(i))
            cout << i << " ";
    }
    cout << endl << "Time:" << (GetTickCount()-l) << endl;
    return;
}
...........................


崇拜,学习..........
1