Advertisement
AZJIO

Вычисление

Apr 23rd, 2013
549
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <time.h>
  4. #include <math.h>
  5.  
  6. int Calc(int kx, int ky, double Sum, int iMin, int iMax);
  7.  
  8. /* тест функции power */
  9. int main()
  10. {
  11.     int z;
  12.     int i;
  13.     //z = Calc(2, 4, 26.0, 1, 10);
  14.     z = Calc(4507, 109, 753967.76, 100, 700);
  15.     //z = Calc(208, 17, 46247.48, 200, 210);
  16.     //system("pause");
  17.     return 0;
  18. }
  19.  
  20. int Calc(int kx, int ky, double Sum, int iMin, int iMax)
  21. {
  22.     int k1, k2, c1, c2, tmpMin;
  23.     int k100 = 100;
  24.     time_t time_start, time_end;
  25.     // Вычисление
  26.     time_start = time(NULL); // метка времени "начало операции"
  27.  
  28.     // умножаем на 100 чтобы иметь дело только с целыми числами
  29.     iMin *= k100;
  30.     iMax *= k100;
  31.     Sum *= k100;
  32.     tmpMin = iMin;
  33.  
  34.     // вычисляем приращение
  35.     if (kx > ky) // если приращение по Х больше приращения по Y, то вычисляем по большему приращению.
  36.     {
  37.         k1 = kx; // меняем местами коэфициенты
  38.         k2 = ky;
  39.         c1 = 0; // меняем местами колонки массива
  40.         c2 = 1;
  41.     }
  42.     else
  43.     {
  44.         k1 = ky;
  45.         k2 = kx;
  46.         c1 = 1;
  47.         c2 = 0;
  48.     }
  49.  
  50.     // Если Х (при минимальном значении Y) превышает масксимальный предел, то минимум вычисляем исходя из  подстановки максимального значения Х
  51.     if (((Sum - iMin * k1) / k2) > iMax)
  52.         iMin = (int) ((Sum - iMax * k2) / k1);
  53.  
  54.     // Если Х (при максимальном значении Y) меньше минимального предела, то максимум вычисляем исходя из  подстановки минимального значения Х. Используем стемпированную iMin, так как оригинальная могла нарушится предыдущим выражением.
  55.     if (((Sum - iMax * k1) / k2) < tmpMin)
  56.         iMax = (int) ceil((Sum - tmpMin * k2) / k1); // округляем до большего, приводим к целому
  57.  
  58.     if (iMin > iMax)
  59.         return 0;
  60.  
  61.     int j = 0;
  62.     int i;
  63.     int iStep = 1;
  64.     double Yx;
  65.     double Xy;
  66.  
  67.     printf("iMin = %d, iMax = %d\n", iMin, iMax);
  68.     for (Yx = iMin; Yx <= iMax; Yx++) // этот цикл определяет количество шагов, между двумя валидными результатами
  69.     {
  70.         Xy = (Sum - Yx * k1) / k2;
  71.         //printf("Xy %d\n", Xy);
  72.         if (trunc(Xy)==Xy) // проверяем что X целое число
  73.         {
  74.             printf("trunc %d %f\n", trunc(Xy), Xy);
  75.             j += 1;
  76.  
  77.             if (j == 1)
  78.             {
  79.                 iMin = Yx; // обновляем минимальный с учётом первого совпадения
  80.                 printf("iMin(1) %d\n", iMin);
  81.             }
  82.             else
  83.             {
  84.                 iStep = Yx - iMin; // получаем шаг цикла, при которых целые значения
  85.                 j -= 1;
  86.                 printf("iStep(1) %d = (%f - %d)\n\n", iStep, Yx, iMin);
  87.                 break; // выходим из цикла
  88.             }
  89.         }
  90.     }
  91.  
  92.     // Окончательно определяем размер массива
  93.     // tmp = ceil((iMax - Yx + 1) / s)
  94.     double aRes[3];
  95.  
  96.     j = 0;
  97.     for (Yx = iMin; Yx <= iMax; Yx+=iStep) // этот цикл продолжает предыдущий, но используя интервал для получения целых чисел
  98.     {
  99.         Xy = (Sum - Yx * k1) / k2;
  100.         j += 1;
  101.         aRes[c1] = Xy / k100;
  102.         aRes[c2] = Yx / k100;
  103.         aRes[2] = aRes[c1] * k2 + aRes[c2] * k1;
  104.         printf("%f %f %f\n", aRes[c1], aRes[c2], aRes[2]);
  105.     }
  106.     time_end = time(NULL); // метка времени "конец операции"
  107.     printf("\ntime_start = \t%f\n"
  108.            "time_end = \t%f\n", (double) time_start, (double) time_end);
  109.     ; // разница между метками
  110.     printf("difftime = \t%f\niStep = \t%d\niMin = \t%d\niMax = \t%d\n", difftime(time_end, time_start), iStep, iMin, iMax);
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement