История изменений
Исправление 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 минут на бумажке да?