我有代码,我无法执行适当的功能测量时间: 我从这里开始测量来自测量时间的指示,我认为一切都应该没问题,但显然不是。 请给我一些直接的衣服,但没有链接到c ++的文档,因为它不会帮助。
#include <iostream>
#include<cstdlib>
#include <ctime>
using namespace std;
int ffibr(int n)
{
if (n<3)
return 1;
return ffibr(n-1)+ffibr(n-2);
}
int ffibi(int n)
{
int a = 1, b = 1,i;
for (i = 3; i <n+1; i++)
{
int c = a + b;
a = b;
b = c;
}
return b;
}
int ffibm(int n)
{
int q11,q12,q21,q22,
p11,p12,p21,p22,
w11,w12,w21,w22;
if(n < 2) return n;
q11 = q12 = q21 = 1;
q22 = 0;
w11 = w22 = 1;
w12 = w21 = 0;
n--;
while(n)
{
if(n & 1)
{
p11 = w11*q11 + w12 * q21;
p12 = w11*q12 + w12 * q22;
p21 = w21*q11 + w22 * q21;
p22 = w21*q12 + w22 * q22;
w11 = p11;
w12 = p12;
w21 = p21;
w22 = p22;
}
n >>= 1;
if(!n) break;
p11 = q11*q11 + q12 * q21;
p12 = q11*q12 + q12 * q22;
p21 = q21*q11 + q22 * q21;
p22 = q21*q12 + q22 * q22;
q11 = p11;
q12 = p12;
q21 = p21;
q22 = p22;
}
return w11;
}
int main()
{
int n;
cerr << "Podaj n-ty wyraz ciagu fibonacciego"<<endl;
cin >> n;
clock_t poczatek, koniec;
double czas1=0;
poczatek = clock();
for (int i=0; i<1000; ++i)
return ffibi(n);
koniec = clock();
czas1 = (double)(koniec-poczatek)/(double)(CLOCKS_PER_SEC); /
system("pause");
cerr << n<<" wyraz ciagu fibonacciego wyliczony metoda rekurencyjna to " << ffibr(n)<<endl;
cerr << n<<" wyraz ciagu fibonacciego wyliczony metoda iteracyjna to " << ffibi(n)<<endl;
cerr << n<<" wyraz ciagu fibonacciego wyliczony metoda macierzy to " << ffibm(n)<<endl;
cerr << "Czas trwania funkcji ffibi to " << czas1<<endl;
//cerr << "Czas trwania funkcji ffibr to " << czas2<<endl;
return 0;
}
功能起作用,但是时间的测量不是。我也尝试过这样的事情:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int ffibr(int n)
{
clock_t poczatek, koniec; // graniczne wartości pomiarowe
const int ILE = 1000; // liczba powtórzeń mierzonej funkcji
poczatek = clock(); // początek pomiaru
for (int i = 0; i<ILE; ++i)
if (n<3)
return 1;
return ffibr(n - 1) + ffibr(n - 2);
koniec = clock(); // koniec pomiaru
double czas1 = (koniec - poczatek) / (CLOCKS_PER_SEC*(double)ILE);
}
int ffibi(int n)
{
int a = 1, b = 1, i;
for (i = 3; i <n + 1; i++)
{
int c = a + b;
a = b;
b = c;
}
return b;
}
int ffibm(int n)
{
int q11, q12, q21, q22, // macierz Q
p11, p12, p21, p22, // macierz P
w11, w12, w21, w22; // macierz W
if (n < 2) return n;
// ustawiam macierz Q
q11 = q12 = q21 = 1;
q22 = 0;
// w macierzy W tworze macierz jednostkową
w11 = w22 = 1;
w12 = w21 = 0;
n--; // będzie nam potrzebna n-1 potęga Q
while (n)
{
if (n & 1)
{
// wykonujemy mnożenie P = W x Q
p11 = w11*q11 + w12 * q21;
p12 = w11*q12 + w12 * q22;
p21 = w21*q11 + w22 * q21;
p22 = w21*q12 + w22 * q22;
// wynik przenosimy: W = P
w11 = p11;
w12 = p12;
w21 = p21;
w22 = p22;
}
n >>= 1; // usuwamy z n sprawdzony bit
if (!n) break;
// podnosimy Q do kwadratu: P = Q x Q
p11 = q11*q11 + q12 * q21;
p12 = q11*q12 + q12 * q22;
p21 = q21*q11 + q22 * q21;
p22 = q21*q12 + q22 * q22;
// wynik przenosimy: Q = p
q11 = p11;
q12 = p12;
q21 = p21;
q22 = p22;
}
return w11;
}
int main()
{
int n;
cerr << "Podaj n-ty wyraz ciagu fibonacciego" << endl;
cin >> n;
cerr << n << " wyraz ciagu fibonacciego wyliczony metoda rekurencyjna to " << ffibr(n) << endl;
cerr << n << " wyraz ciagu fibonacciego wyliczony metoda iteracyjna to " << ffibi(n) << endl;
cerr << n << " wyraz ciagu fibonacciego wyliczony metoda macierzy to " << ffibm(n) << endl;
cerr << "Czas trwania funkcji ffibi to " << czas1 << endl;
//cerr << "Czas trwania funkcji ffibr to " << czas2<<endl;
return 0;
}
我知道出了什么问题......
答案 0 :(得分:2)
这将在for循环的第一次迭代中退出main()
:
for (int i=0; i<1000; ++i)
return ffibi(n);
所以你不会得到时间结果,因为main()
的其余部分甚至都没有被执行。
将其更改为例如:
for (int i=0; i<1000; ++i)
{
volatile int result = ffibi(n);
}
请注意使用volatile
来阻止编译器优化冗余循环。