LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

Хоспади ну я и дебил (смотреть в удалённых)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

struct list
{
    char * data;
    struct list * next;
};

int main(int argc, char ** argv)
{
    char     input[]   = "9876543210";
    int      need_found = 200;
    uint8_t  input_len = sizeof(input);
    char     reuse[input_len*2];
    uint16_t limit  = 0x1FF;
    uint64_t reuse_cnt = 0;
    struct list * l = malloc(sizeof(struct list));
    struct list * last = l;
    for (int skip = 0; skip != limit; ++skip )
    {
        for( int opers=limit ;opers != -1; opers--)
        {
            for (int i = 0; i != input_len;i++)
            {
               reuse[reuse_cnt++] = input[i];
               if( i+2 != input_len && ((skip >> i) & 1))
               {
                  reuse[reuse_cnt++] = ((opers >> i) & 1) ? '-' : '+';
               }
            }
            int64_t on[] = {0,0,0,0,0,0,0,0,0,0,0};
            char *  fmt  =  "%li%li%li%li%li%li%li%li%li%li";
            long n = sscanf(reuse, fmt, &on[0],&on[1],&on[2],
                                        &on[3],&on[4],&on[5],
                                        &on[6],&on[7],&on[8],
                                                      &on[9]);

            int64_t result = 0;
            for (int x = 0; x < n; x++)
            {
                 result+=on[x];
            }
            if(result == need_found)
            {
               int found = 0;
               struct list * ln = l;
               while(ln)
               {
                  if(ln->data)
                  {
                      if(strcmp(ln->data,reuse) == 0)
                      {
                         found=1;
                         break;
                      }
                  }
                  ln = ln->next;
               }

               if(found==0)
               {
                  last->next = malloc(sizeof(struct list));
                  last->next->data = malloc(strlen(reuse)+1);
                  memcpy(last->next->data,reuse,strlen(reuse)+1);
                  last=last->next;
               }
            }

            memset(reuse,0,sizeof(reuse));
            reuse_cnt=0;
         }
    }
    while(l)
    {
       if(l->data)
       {
           printf("%-2zu: %-17s == 200\n",++reuse_cnt,l->data);
           free(l->data);
       }
       last = l;
       l = l->next;
       free(last);
    }
    return 0;
}
dron@gnu:~/Рабочий-стол$ gcc -Wall -Werror test.c && ./a.out 
1 : 9-8+7-6-5-4-3+210 == 200
2 : 9-8-7-6-5+4+3+210 == 200
3 : 98+76-5+43-2-10   == 200
4 : 98-7+65+43+2-1-0  == 200
5 : 98-7+65+43+2-1+0  == 200
dron@gnu:~/Рабочий-стол$ 

С меня хватит! Сваливаю на винду и буду в гамбасе мышкой программировать и формы рисовать! Или визуал бейски или как там его зобыл. @rtxtxtrx эта задача была из разряда решить за 10 минут на бумажке да? Если да, тогда я её в 144 раза дольше решал :D

Исходная версия LINUX-ORG-RU, :

Хоспади ну я и дебил (смотреть в удалённых)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

struct list
{
    char * data;
    struct list * next;
};

int main(int argc, char ** argv)
{
    char     input[]   = "9876543210";
    int      need_found = 200;
    uint8_t  input_len = sizeof(input);
    char     reuse[input_len*2];
    uint16_t limit  = 0x1FF;
    uint64_t reuse_cnt = 0;
    struct list * l = malloc(sizeof(struct list));
    struct list * last = l;
    for (int skip = 0; skip != limit; ++skip )
    {
        for( int opers=limit ;opers != -1; opers--)
        {
            for (int i = 0; i != input_len;i++)
            {
               reuse[reuse_cnt++] = input[i];
               if( i+2 != input_len && ((skip >> i) & 1))
               {
                  reuse[reuse_cnt++] = ((opers >> i) & 1) ? '-' : '+';
               }
            }
            int64_t on[] = {0,0,0,0,0,0,0,0,0,0,0};
            char *  fmt  =  "%li%li%li%li%li%li%li%li%li%li";
            long n = sscanf(reuse, fmt, &on[0],&on[1],&on[2],
                                        &on[3],&on[4],&on[5],
                                        &on[6],&on[7],&on[8],
                                                      &on[9]);

            int64_t result = 0;
            for (int x = 0; x < n; x++)
            {
                 result+=on[x];
            }
            if(result == need_found)
            {
               int found = 0;
               struct list * ln = l;
               while(ln)
               {
                  if(ln->data)
                  {
                      if(strcmp(ln->data,reuse) == 0)
                      {
                         found=1;
                         break;
                      }
                  }
                  ln = ln->next;
               }

               if(found==0)
               {
                  last->next = malloc(sizeof(struct list));
                  last->next->data = malloc(strlen(reuse)+1);
                  memcpy(last->next->data,reuse,strlen(reuse)+1);
                  last=last->next;
               }
            }

            memset(reuse,0,sizeof(reuse));
            reuse_cnt=0;
         }
    }
    while(l)
    {
       if(l->data)
       {
           printf("%-2zu: %-17s == 200\n",++reuse_cnt,l->data);
           free(l->data);
       }
       last = l;
       l = l->next;
       free(last);
    }
    return 0;
}
dron@gnu:~/Рабочий-стол$ gcc -Wall -Werror test.c && ./a.out 
1 : 9-8+7-6-5-4-3+210 == 200
2 : 9-8-7-6-5+4+3+210 == 200
3 : 98+76-5+43-2-10   == 200
4 : 98-7+65+43+2-1-0  == 200
5 : 98-7+65+43+2-1+0  == 200
dron@gnu:~/Рабочий-стол$ 

С меня хватит! Сваливаю на винду и буду в гамбасе мышкой программировать и формы рисовать! Или визуал бейски или как там его зобыл. @rtxtxtrx эта задача была из разряда решить за 10 минут на бумажке да?