Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > не могу понять в чём ошибка


Автор: Игорь1024 8.10.2010, 16:13
Делал задачу. Попытался к ней написать программу. Не получается у меня понять в чём у меня ошибка...
Вот код (это черновой вариант, так что здесь нет никакой оптимизации и.т.п. Короче коряво всё)
Код

#include <iostream>
#include <fstream>
#include "math.h"
using namespace std;
int n,num=0,group,start,temp,temp1,i,add1=111,add2=999;
unsigned long int svalue=2000,value;
char buffer[10];
float buf;
void final()

  i=n-start;
  value=svalue;
  cout<<"svaluerightnow= "<<svalue<<'\n';
  value/=1000;
  value-=20000;
  cout<<"svalueafter= "<<svalue<<'\n';//даже после деления результат 40000000
  for(int j=0;j<(group);++j)
  {
   if((j%2)==0)
   {
    value+=add1;
   }
   else if((j%2)==1)
   {
    value+=add2;
   }
  }
  cout<<"VALUE= "<<value<<'\n';
}
float round(float d)

  d/=8;
  temp=d;
  cout<<'\n'<<"temp= "<<temp;
  if((d-temp!=0)&&((d+0.5)-temp)<1){cout<<"ceil(d+0.5)= "<<ceil(d+0.5);return ceil(d+0.5);}
  else {
     cout<<'\n'<<"d= "<<d;
     return ceil(d);
  }
}
void getstart()
{
    switch (group)
    {
    case 1:start=1;svalue=0;
        break;
    case 2:start=11;svalue=10;
        break;
    case 3:start=20;svalue=111;
        break;
    case 4:start=29;svalue=2000;
        break;
    default:
        start+=29+((group-4)*8);
        temp=100;
        temp1=900;
        svalue=2000;
        for(i=1;i<(group-1);i++)
        {   
            cout<<"svalue= "<<svalue<<" ";
            if(i%2==1)
            {
            temp*=10;
            add1+=temp;
            cout<<"add1= "<<add1<<'\n';
            }
            else if(i%2==0)
            {
            svalue*=10;
            temp1*=10;
            add2+=temp1;
            cout<<"add2= "<<add2<<'\n';
            }
                
        }
        break;

    }
    svalue*=2000;
    cout<<'\n'<<"start= "<<start<<'\n';
    final();
}
int count()
{   
    ifstream input("in.txt");
    input>>buffer;
    n=atoi(buffer);
    if(n>0&&n<11){group=1;}
    if(n>10&&n<20){group=2;}
    if(n>19&&n<29){group=3;}
    if(n>28){ 
    buf=n-28;
    cout<<"buf= "<<buf;
    group=round(buf)+3;
    cout<<"group start= "<<group<<'\n';
    }
    getstart();
    if(group==0){cout<<'\a'<<"Error! ";goto end;}
    cout<<"group= "<<group;
    goto end;
        end:return 0;
}

int main()
{   
    count();
    cout<<'\n'<<"V= "<<value<<'\n';
    cin>>n;
    return 0;
}




А вообще задача была в том , чтобы считать число n, найти в числовом ряду элемент с индексом n (но каждое число ряда не должно содержать в десятичной записи цифр предыдущего и должно быть максимально "близким" к предыдущему).
Перебором делать долго (1<n<500);
Я нашёл зависимость (а вдруг ошибся..) и делал по ней.

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

Добавлено @ 16:16
Вот последовательность:
0
1
2
3
4
5
6
7
8
9
10
22
30
41
50
61
70
81
90
111
200
311
400
511
600
2000
3111

и так далеечисла можно сгрупировать по разрядам- 1 группа- 10 эл, 2 и 3- по 9 каждая, далее каждая группа из 8 чисел сосотоит.

Автор: FlySabaka 8.10.2010, 18:49
Действительно, а в чём ошибка-то? Думаю что не хватает подробностей в описании проблемы ... 

Автор: Crafty 8.10.2010, 19:20
Код

  i=n-start;
  value=svalue;
  cout<<"svaluerightnow= "<<svalue<<'\n';
  value/=1000;
  value-=20000;
  cout<<"svalueafter= "<<svalue<<'\n';//даже после деления результат 40000000

Тут скорей всего value должно выводиться во второй строке вывода, значение svalue и не будет менять так как вы с ним ничего не делаете.

Код

 ifstream input("in.txt");
    input>>buffer;
    n=atoi(buffer);

Не проще ли сделать buffer типа int, и не использовать ф-цию atoi.

Автор: Игорь1024 8.10.2010, 23:15
Нашёл проблему. Сделал вывод-надо больше спать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)