printf против cout
От: olimp_20  
Дата: 28.06.15 10:02
Оценка:
Условие задачи
  Решение с помощью printf
#include <stdio.h>
#include <vector>
#include <cmath>
using namespace std;

double cv[7];//вектор значений емкостей конденсаторов
double C;//эталонное значение
double CAnsw;//ответ на задачу


void f(double* cv, int n);

//функции вычисления мин. значения, согласно условию задачи (сравнение с С)
double min2d(double a, double b);
double min3d(double a, double b, double c);

//------------------------------------------------------
int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int n;
    scanf("%d", &n);

    scanf("%Lf", &C);

    for(int i=0; i<n; ++i)
        scanf("%Lf", &cv[i]);

    CAnsw = cv[0];
    for(int i=1; i<n; ++i)
        CAnsw = min2d(CAnsw, cv[i]);

    f(cv, n);
    
    printf("%0.6Lf\n", CAnsw);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    return 0;
}
//------------------------------------------------------
//------------------------------------------------------
void f(double* cv, int n){
    for(int i=0; i<n-1; ++i)//перебрать все пары конденсаторов из cv
        for(int j=i+1; j<n; ++j){

            double c1 = cv[i] + cv[j];//параллельное соединение
            double c2 = (cv[i] * cv[j]) / c1; //последовательное соединение

            CAnsw = min3d(CAnsw, c1, c2);

            //создание новой последовательности без cv[i] и cv[j]
            double cvSmall[7];
            int k(0);
            for(int z(0); z<n; ++z)
                if(z!=i && z!=j) {cvSmall[k]=cv[z]; ++k;}

            cvSmall[k]=c1;
            f(cvSmall, k+1);//новая последовательность и с1

            cvSmall[k]=c2;
            f(cvSmall, k+1);//новая последовательность и с2
        }
}

//------------------------------------------------------
double min2d(double a, double b){
    return fabs(C-b)-fabs(C-a)>=0.0 ? a : b;
}

//------------------------------------------------------
double min3d(double a, double b, double c){
    return fabs(C-b)-fabs(C-a)>=0.0 ? min2d(a, c) : min2d(b, c);
}

на все тесты сообщает: неправильный ответ.
  А решение с fstream+iomanip
#include <fstream>
#include <iomanip>

#include <vector>
#include <cmath>
using namespace std;

double cv[7];//вектор значений емкостей конденсаторов
double C;//эталонное значение
double CAnsw;//ответ на задачу


void f(double* cv, int n);

//функции вычисления мин. значения, согласно условию задачи (сравнение с С)
double min2d(double a, double b);
double min3d(double a, double b, double c);

//------------------------------------------------------
int main()
{
    ifstream fileIn("input.txt");
    ofstream fileOut("output.txt");

    fileOut.setf(ios::fixed);
    fileOut.precision(6);

    int n;
    fileIn >> n;

    fileIn >> C;

    for(int i=0; i<n; ++i)
    fileIn >> cv[i];

    CAnsw = cv[0];
    for(int i=1; i<n; ++i)
        CAnsw = min2d(CAnsw, cv[i]);

    f(cv, n);

    fileOut << CAnsw << '\n';
    fileIn.close();
    fileOut.close();

    return 0;
}
//------------------------------------------------------
//------------------------------------------------------
void f(double* cv, int n){
    for(int i=0; i<n-1; ++i)//перебрать все пары конденсаторов из cv
        for(int j=i+1; j<n; ++j){

            double c1 = cv[i] + cv[j];//параллельное соединение
            double c2 = (cv[i] * cv[j]) / c1; //последовательное соединение

            CAnsw = min3d(CAnsw, c1, c2);

            //создание новой последовательности без cv[i] и cv[j]
            double cvSmall[7];
            int k(0);
            for(int z(0); z<n; ++z)
                if(z!=i && z!=j) {cvSmall[k]=cv[z]; ++k;}

            cvSmall[k]=c1;
            f(cvSmall, k+1);//новая последовательность и с1

            cvSmall[k]=c2;
            f(cvSmall, k+1);//новая последовательность и с2
        }
}

//------------------------------------------------------
double min2d(double a, double b){
    return fabs(C-b)-fabs(C-a)>=0.0 ? a : b;
}

//------------------------------------------------------
double min3d(double a, double b, double c){
    return fabs(C-b)-fabs(C-a)>=0.0 ? min2d(a, c) : min2d(b, c);
}

успешно решает задачу.
Подскажите, что неправильно в первом варианте, как исправить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.