Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <windows.h>
- #include <time.h>
- #include <math.h>
- int Calc(int kx, int ky, double Sum, int iMin, int iMax);
- /* тест функции power */
- int main()
- {
- int z;
- int i;
- //z = Calc(2, 4, 26.0, 1, 10);
- z = Calc(4507, 109, 753967.76, 100, 700);
- //z = Calc(208, 17, 46247.48, 200, 210);
- //system("pause");
- return 0;
- }
- int Calc(int kx, int ky, double Sum, int iMin, int iMax)
- {
- int k1, k2, c1, c2, tmpMin;
- int k100 = 100;
- time_t time_start, time_end;
- // Вычисление
- time_start = time(NULL); // метка времени "начало операции"
- // умножаем на 100 чтобы иметь дело только с целыми числами
- iMin *= k100;
- iMax *= k100;
- Sum *= k100;
- tmpMin = iMin;
- // вычисляем приращение
- if (kx > ky) // если приращение по Х больше приращения по Y, то вычисляем по большему приращению.
- {
- k1 = kx; // меняем местами коэфициенты
- k2 = ky;
- c1 = 0; // меняем местами колонки массива
- c2 = 1;
- }
- else
- {
- k1 = ky;
- k2 = kx;
- c1 = 1;
- c2 = 0;
- }
- // Если Х (при минимальном значении Y) превышает масксимальный предел, то минимум вычисляем исходя из подстановки максимального значения Х
- if (((Sum - iMin * k1) / k2) > iMax)
- iMin = (int) ((Sum - iMax * k2) / k1);
- // Если Х (при максимальном значении Y) меньше минимального предела, то максимум вычисляем исходя из подстановки минимального значения Х. Используем стемпированную iMin, так как оригинальная могла нарушится предыдущим выражением.
- if (((Sum - iMax * k1) / k2) < tmpMin)
- iMax = (int) ceil((Sum - tmpMin * k2) / k1); // округляем до большего, приводим к целому
- if (iMin > iMax)
- return 0;
- int j = 0;
- int i;
- int iStep = 1;
- double Yx;
- double Xy;
- printf("iMin = %d, iMax = %d\n", iMin, iMax);
- for (Yx = iMin; Yx <= iMax; Yx++) // этот цикл определяет количество шагов, между двумя валидными результатами
- {
- Xy = (Sum - Yx * k1) / k2;
- //printf("Xy %d\n", Xy);
- if (trunc(Xy)==Xy) // проверяем что X целое число
- {
- printf("trunc %d %f\n", trunc(Xy), Xy);
- j += 1;
- if (j == 1)
- {
- iMin = Yx; // обновляем минимальный с учётом первого совпадения
- printf("iMin(1) %d\n", iMin);
- }
- else
- {
- iStep = Yx - iMin; // получаем шаг цикла, при которых целые значения
- j -= 1;
- printf("iStep(1) %d = (%f - %d)\n\n", iStep, Yx, iMin);
- break; // выходим из цикла
- }
- }
- }
- // Окончательно определяем размер массива
- // tmp = ceil((iMax - Yx + 1) / s)
- double aRes[3];
- j = 0;
- for (Yx = iMin; Yx <= iMax; Yx+=iStep) // этот цикл продолжает предыдущий, но используя интервал для получения целых чисел
- {
- Xy = (Sum - Yx * k1) / k2;
- j += 1;
- aRes[c1] = Xy / k100;
- aRes[c2] = Yx / k100;
- aRes[2] = aRes[c1] * k2 + aRes[c2] * k1;
- printf("%f %f %f\n", aRes[c1], aRes[c2], aRes[2]);
- }
- time_end = time(NULL); // метка времени "конец операции"
- printf("\ntime_start = \t%f\n"
- "time_end = \t%f\n", (double) time_start, (double) time_end);
- ; // разница между метками
- printf("difftime = \t%f\niStep = \t%d\niMin = \t%d\niMax = \t%d\n", difftime(time_end, time_start), iStep, iMin, iMax);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement