powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение больших чисел. Не могу понять в чём ошибка.
28 сообщений из 28, показаны все 2 страниц
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38708748
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Разминался сегодня и решал несложную задачу:

ЗАДАНИЕ
Главный вождь племени Абба не умеет считать. В обмен на одну из его земель вождь другого племени предложил ему выбрать одну из трех куч с золотыми монетами. Но вождю племени Абба хочется получить наибольшее количество золотых монет. Помогите вождю сделать правильный выбор!

Входные данные:
В первой строке входного файла INPUT.TXT записаны три натуральных числа через пробел. Каждое из чисел не превышает 10^100.

Выходные данные:
В выходной файл OUTPUT.TXT нужно вывести одно целое число — максимальное количество монет, которые может взять вождь.


Совсем простая, но я загружаю её на сервер, и на первом тесте Wrong Answer, хотя когда я проверяю на своей машине, всё нормально.
Я сначала подумал что у меня неправильный алгоритм, но почитал, и остальные сравнивают большие числа аналогичным образом. Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
#include <stdio.h>
#include <stdlib.h>

struct lll_number
{
	char digits[100];
	unsigned int pow;
} cur, max;

//Функция не общего вида, плюс побочный эффект и название мне не нравится. Вообщем я знаю что она плохая.
int get_num_from_file(FILE* f)
{
	cur.pow = 0;
	int t;
	while (((t = getc(f)) != EOF) && t != ' ')
	{
		cur.digits[cur.pow] = t;
		cur.pow++;
	}
	//cur.digits[cur.pow] = '\0';
	//cur.pow++;
	return (t == EOF) ? -1 : 1;
}

//Возвращает -1 0 1 , согласно числовой оси
int compare_2lll_number(struct lll_number* num1, struct lll_number* num2)
{
	if (num1->pow > num2->pow)
	{
		return -1;
	}
	else if (num1->pow < num2->pow)
	{
		return 1;
	}
	else
	{
		for (int i = 0; i < num1->pow; i++)
		{
			if (num1->digits[i] > num2->digits[i])
			{
				return -1;
			}
			else if (num1->digits[i] < num2->digits[i])
			{
				return 1;
			}
		}
		return 0;
	}
}

int copy(const struct lll_number* num1, struct lll_number* num2)
{
	for (int i = 0; i < num1->pow; i++)
	{
		num2->digits[i] = num1->digits[i];
	}
	num2->pow = num1->pow;
	return 1;
}

int main(int argc,char** argv)
{
	max.pow = 0;//не нравится

	FILE* in = fopen("input.txt", "r");
	while (get_num_from_file(in)!=-1)
	{
		if (compare_2lll_number(&cur, &max) == -1)
		{
			copy(&cur, &max);
		}
	}
	if (compare_2lll_number(&cur, &max) == -1)
	{
		copy(&cur, &max);
	}
	freopen("OUTPUT.TXT", "w", stdout);
	for (int i = 0; i < max.pow; i++)
	{
		printf("%c", max.digits[i]);//специально так вывожу
	}
	fclose(in);
	fclose(stdout);
	return 0;
} 



Подскажите пожалуйста, что я упускаю ?

PS Это мне не нужно ни для какого участия в конкурсе, не подумайте. Просто я каждый день решаю как минимум 2 задачи, и вот наткнулся на эту. Вот ссылка на неё тут
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38708825
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Я немного подправил твой пост, добавил оригинальное условие.

И всё же -- оно шизонутое.
"нужно вывести одно целое число — максимальное количество монет, которые может взять вождь."

Блин, нужно просто найти максимум из трёх этих чисел, а не "которое может взять вождь".
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38708837
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Сразу -- зачем тебе этот POW ?
Это же кол-во цифр в числе, т.е. длина строки.

как делал бы я:

убрал лидирующие нули, если они есть.

вычислил длины строк, если какая-то с болшей длиной -- это искомое максимальное число.

если длины хотя бы двух чисел одинаковы, то надо отбросить число с меньшей длиной и сравнивать оставшиеся.

сравнение делается просто посимвольно, начиная со старших разрядов. Если разряд больше или меньше -- у нас есть победитель (максимум), если равны -- берём следующий разряд.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38708863
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Потом, зачем такие сложности с вводом ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <stdio.h>
#include <stdlib.h>

#define N_NUMBERS 3
#define NUMBER_MAX_LEN 100

int main(int argc,char** argv)                                                                                                                        
{                                                                                                                                                     
  char num[N_NUMBERS][NUMBER_MAX_LEN];                                                                                                                
                                                                                                                                                      
  FILE* in = fopen("input.txt", "r");                                                                                                                 
  if( !in )                                                                                                                                           
    {                                                                                                                                                 
      printf("file 'input.txt' not found.\n");                                                                                                        
      return 1;                                                                                                                                       
    }                                                                                                                                                 
  fscanf( in, "%s %s %s\n", &num[0][0], &num[1][0], &num[2][0] );                                                                                     
                                                                                                                                                      
  for( int i = 0; i < N_NUMBERS; ++i )                                                                                                                
    printf( "number #%d = %s\n", i, num[i] );                                                                                                         
                                                                                                                                                      
  return 0;                                                                                                                                           
}
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38708914
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_NUMBERS 6
#define NUMBER_MAX_LEN 100+1

int cmp_nums( char num1[], char num2[] )
{
  if( !num1 || !num2 )
    return 0; // NB! can't process exception corrrectly.

  unsigned len1 = strlen(num1);
  unsigned len2 = strlen(num2);

  printf("comparing %s and %s ...", num1, num2 );

  if( len1 > len2 ) return 1;
  else if ( len1 < len2 ) return -1;
  for( int i = 0; i < len1; ++i )
    if( num1[i] - num2[i] ) return printf( "= %d\n", (int)(num1[i] - num2[i])), num1[i] - num2[i];
  return printf("= 0\n"), 0;
}

int main(int argc,char** argv)
{
  char num[N_NUMBERS][NUMBER_MAX_LEN];

  FILE* in = fopen("input.txt", "r");
  if( !in )
    {
      printf("file 'input.txt' not found.\n");
      return 1;
    }

  for( int i = 0; i < N_NUMBERS; ++i )
    fscanf( in, "%s", &num[i][0]);

  for( int i = 0; i < N_NUMBERS; ++i )
    printf( "number #%d = %s\n", i, num[i] );
  
  char maximum[NUMBER_MAX_LEN];

  strcpy( maximum, num[0] );

  for( int i = 1; i < N_NUMBERS; ++i )
  {
    printf(" i = %d\n", i );
    if( cmp_nums( num[i], maximum ) > 0 )
      strcpy( maximum, num[i] );
  }

  printf( "\nmaximum = %s\n", maximum );
  return 0;
}



input.txt
Код: plaintext
1.
1234567895 1234567891 1234567892 123456 1234567899 9999



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ziv@xozzo:~/x/c/bignum-cmp$ gcc -std=c99 -o bignum-cmp bignum-cmp.c  && ./bignum-cmp 
number #0 = 1234567895
number #1 = 1234567891
number #2 = 1234567892
number #3 = 123456
number #4 = 1234567899
number #5 = 9999
 i = 1
comparing 1234567891 and 1234567895 ...= -4
 i = 2
comparing 1234567892 and 1234567895 ...= -3
 i = 3
comparing 123456 and 1234567895 ... i = 4
comparing 1234567899 and 1234567895 ...= 4
 i = 5
comparing 9999 and 1234567899 ...
maximum = 1234567899
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38708933
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Так я и не понял, что у тебя не так.
Я бы сказал, не так ВСЁ, но вроде бы твоя программа ДОЛЖНА всёже работать.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709100
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСовсем простая, но я загружаю её на сервер, и на первом тесте Wrong Answer, хотя когда я проверяю на своей машине, всё нормально.


А какой первый тест?
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709131
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pirovindos,

Видимо, с этой страницы, номер 1.

NINPUT.TXTOUTPUT.TXT15 7 37
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709155
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного ещё улучшил, чтобы не менять кол-во входных чисел всё время.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_NUMBERS 50
#define NUMBER_MAX_LEN 100+1
#define NDEBUG

int cmp_nums( char num1[], char num2[] )
{
  if( !num1 || !num2 )
    return 0; // NB! can't process exception corrrectly.

  unsigned len1 = strlen(num1);
  unsigned len2 = strlen(num2);

  #ifdef DEBUG
    printf("comparing %s and %s ...", num1, num2 );
  #endif

  if( len1 > len2 ) return 1;
  else if ( len1 < len2 ) return -1;
  for( int i = 0; i < len1; ++i )
    {
      if( num1[i] - num2[i] )
	{
	  #ifdef DEBUG
	    printf( "= %d\n", (int)(num1[i] - num2[i]));
	  #endif
	  return num1[i] - num2[i];
	}
    }
  return printf("= 0\n"), 0;
}

int main(int argc,char** argv)
{
  char num[N_NUMBERS][NUMBER_MAX_LEN];
  unsigned n = 0;

  FILE* in = fopen("input.txt", "r");
  if( !in )
    {
      printf("file 'input.txt' not found.\n");
      return 1;
    }

  for( int i = 0; i < N_NUMBERS; ++i )
    {
      if( fscanf( in, "%s", &num[i][0]) > 0)
	++n;
      else
	break;
    }

  for( int i = 0; i < n; ++i )
    printf( "number #%d = %s\n", i, num[i] );

  char maximum[NUMBER_MAX_LEN];

  strcpy( maximum, num[0] );

  for( int i = 1; i < n; ++i )
    {
      if( cmp_nums( num[i], maximum ) > 0 )
	strcpy( maximum, num[i] );
    }

  printf( "\nmaximum = %s\n", maximum );
  return 0;
}
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709277
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача действительно "шизанутая". Она даже плохо привязывается к знаниям арифметики у древних.

Золото можно достаточно точно взвешивать на чашечных весах и определять где больше.

Гораздо более интересные на мой взгляд задачи древней арифметики.

Налоги в древнем Риме. Учёт процентов в Римской системе счисления.

Вавилонская система счисления. Таблица Пифагора для нее. Вопросы запоминания базовых операций.

Расчёты на абаке. На соробане. Вопросы умножения и деления.

Система счисления Фибоначчи. Какие профиты?

Геометрия землемеряния. Классические задачи прямых углов и деления угла на равные части (2,3,5 e.t.c)

Морская навигация древних. Картография.

Берите любую задачу и я с удовольствием тоже включусь в нее.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709331
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадача действительно "шизанутая". Она даже плохо привязывается к знаниям арифметики у древних.


Да задача-то нормальная, нахрена было только выдумывать каких-то вождей и какое-то золото?

Всё же просто: найти максимальное число из нескольких натуральных чисел не более 10:100.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709339
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Но условие при котором число достигает 10^100 предполагает символьную арифметику.
По сути - лексикографическое сравнение двух строк если разрядность одинакова или тривиальную
оценку размера если одна строка больше по длине.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709350
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа задача-то нормальная, нахрена было только выдумывать каких-то вождей и какое-то золото?
Сделай поправку что ИТ-мозг изобретал для подростков, похоже фантазии за рамками программирования не много, как говорится "хотели как лучше, получилось как всегда".
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709483
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Если так:
SashaMercury я загружаю её на сервер, и на первом тесте Wrong Answer, хотя когда я проверяю на своей машине, всё нормально.

тогда возможно, что input.txt содержит какие-то символы после цифр перед EOF.
Предлагаю тогда уже проверять не на равенство пробелу, а на непринадлежность символа диапазону кодов десятичных цифр: 0x30-0x39.

2. По правилам оформления должно быть freopen("input.txt","r",stdin);?
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709540
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа задача-то нормальная, нахрена было только выдумывать каких-то вождей и какое-то золото?потому что в реальной жизни постановки ещё более сумасшедшие, а то что "Всё же просто: найти максимальное число из нескольких натуральных чисел не более 10:100" понимаешь только после пары дней активного мозгового штурма ;-))
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709626
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНемного ещё улучшил, чтобы не менять кол-во входных чисел всё время.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_NUMBERS 50
#define NUMBER_MAX_LEN 100+1
#define NDEBUG

int cmp_nums( char num1[], char num2[] )
{
  if( !num1 || !num2 )
    return 0; // NB! can't process exception corrrectly.

  unsigned len1 = strlen(num1);
  unsigned len2 = strlen(num2);

  #ifdef DEBUG
    printf("comparing %s and %s ...", num1, num2 );
  #endif

  if( len1 > len2 ) return 1;
  else if ( len1 < len2 ) return -1;
  for( int i = 0; i < len1; ++i )
    {
      if( num1[i] - num2[i] )
	{
	  #ifdef DEBUG
	    printf( "= %d\n", (int)(num1[i] - num2[i]));
	  #endif
	  return num1[i] - num2[i];
	}
    }
  return printf("= 0\n"), 0;
}

int main(int argc,char** argv)
{
  char num[N_NUMBERS][NUMBER_MAX_LEN];
  unsigned n = 0;

  FILE* in = fopen("input.txt", "r");
  if( !in )
    {
      printf("file 'input.txt' not found.\n");
      return 1;
    }

  for( int i = 0; i < N_NUMBERS; ++i )
    {
      if( fscanf( in, "%s", &num[i][0]) > 0)
	++n;
      else
	break;
    }

  for( int i = 0; i < n; ++i )
    printf( "number #%d = %s\n", i, num[i] );

  char maximum[NUMBER_MAX_LEN];

  strcpy( maximum, num[0] );

  for( int i = 1; i < n; ++i )
    {
      if( cmp_nums( num[i], maximum ) > 0 )
	strcpy( maximum, num[i] );
    }

  printf( "\nmaximum = %s\n", maximum );
  return 0;
}




Здравствуйте C:
Спасибо всем за помощь :) К сожалению вчера вечером я не выходил в интернет(ибо стали болеть глаза, и я решил пару недель по вечерам не включать компьютер).

Код выше заработал сразу, с одной поправкой,
Код: plaintext
1.
#define NUMBER_MAX_LEN 101+1

.
Час изучал каждую строчку вашего и своего кода, ввёл у себя пределы. Всё-равно не работало. Тогда я стал читать поток таким образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for (int i = 0; i < N_NUMBERS; ++i)
	{
		fscanf(in, "%s", &cur.digits);
		cur.pow = strlen(cur.digits);
		if (compare_2lll_number(&cur, &max) == -1)
		{
			copy(&cur, &max);
		}
	}



И всё сразу заработало.

MasterZiv, хотя ваша функция сравнения очевидно красивее. Заодно разобрал что значат #ifdef и #ifndef . Мощная штука, не перестаю удивляться красоте языка C:
Ещё пока разбираю код. Попозже дополню
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709644
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
в общем я всё равно её переписал, использовал много из вашего кода, кроме того что не стал хранить все элементы в памяти.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_NUMBERS 3
#define NUMBER_MAX_POW 101+1


//Возвращает -1 0 1 , согласно числовой оси
int compare_101c_number(const char* num1,const char* num2)
{
	unsigned int pow1 = strlen(num1);
	unsigned int pow2 = strlen(num2);
	
	if (pow1>pow2)	return -1;
	else if (pow1 < pow2) return 1;

	for (int i = 0; i < pow1; ++i)
	{
		if (*(num1 + i) - *(num2 + i))//если встретились разные значения по позициям
		{
			return (int)(*(num2 + i) - *(num1 + i));
		}
	}

	return 0;//числа равны
}

int main(int argc, char** argv)
{
	char numbers[2][NUMBER_MAX_POW];//текущее число в 1 строке, максимальное число во 2 строке
	numbers[1][0] = '0';
	numbers[1][1] = '\0';

	FILE* in = fopen("input.txt", "r");
	if (!in)
	{
		printf("File 'input.txt' not found.\n");
	}

	for (int i = 0; i < N_NUMBERS; ++i)
	{
		fscanf(in, "%s", &numbers[0][0]);
		if (compare_101c_number(numbers[0],numbers[1]) < 0)
		{
			strcpy(numbers[1], numbers[0]);
		}
	}
	FILE* out = fopen("output.txt", "w");
	fprintf(out, "%s", numbers[1]);

	fclose(in);
	fclose(out);
	return 0;
}



самая красивая часть программы

Код: plaintext
1.
if (*(num1 + i) - *(num2 + i))


нравится, что не нужно писать !=0, или дважды сравнивать больше нуля, меньше нуля, нужно только знать как работает оператор if, и тогда всё сразу понятно :)

PS
Я думаю, мой первый вариант не работал из-за кодировки на сервере или чего-нибудь подобного. Проблема оказалась в считывании данных из файла.(я уже писал выше)
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709693
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZiv, хотя ваша функция сравнения очевидно красивее. Заодно разобрал что значат #ifdef и #ifndef . Мощная штука, не перестаю удивляться красоте языка C:
Ещё пока разбираю код. Попозже дополню

Код: plaintext
1.
Как много нам открытий чудных
готовит просвещенья дух...

Саша, это -- школярная хрень, кусок тривиального кода, банальшина.
Конечно, язык С красивый, конечно, можно восхищяться каждой строчкой, по сравнению с отвратительным паскалем.
Но тебе надо "ускоряться" как-то что ли, чтобы восхищяться какими-то более серьёзными вещами.
А то, я боюсь, ты навосхищаешься, а на серьёзные вещи сил уже не останется.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709695
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Тогда я стал читать поток таким образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for (int i = 0; i < N_NUMBERS; ++i)
	{
		fscanf(in, "%s", &cur.digits);
		cur.pow = strlen(cur.digits);
		if (compare_2lll_number(&cur, &max) == -1)
		{
			copy(&cur, &max);
		}
	}



И всё сразу заработало.


Я так и подозревал, что дело во вводе.
На самом деле, ввод и вывод -- всегда вроде бы тривиальные части программы, но не всегда самые простые, и в них достаточно легко запутаться. Причём это характерно не только для языка С, а и вообще для программирования.

Поэтому хочу ещё раз напомнить про замечательную технику программирования, которую нам (мне лично и моим однокашникам) прививали с первого курса института, которая называется "контрольная печать" :
сразу после ввода данных они тут же распечатываются (делается их вывод) с целью контроля правильности ввода.

И эта техника полезна не только для начинающих. Я до сих пор периодически пользуюсь.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709697
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё.
Мы с Анатолием Широковым обсудили это дело, и он высказал идею, что сравнивать можно тупо через
strcmp.
Предварительно нужно естественно убрать лидирующие пробелы и нули.
Я согласился.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38709739
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окончательный вариант,
добавлено обрезание лидирующих пробелов и нулей.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_NUMBERS 50
#define NUMBER_MAX_LEN 100+1
#define NDEBUG

int cmp_nums( char num1[], char num2[] )
{
  if( !num1 || !num2 )
    return 0; // NB! can't process exception corrrectly.

  while( *num1 && strchr( "0 \t", *num1 ) )
    ++num1;

  while( *num2 && strchr( "0 \t", *num2 ) )
    ++num2;

  unsigned len1 = strlen(num1);
  unsigned len2 = strlen(num2);
 
  #ifdef DEBUG
    printf("comparing %s and %s ...", num1, num2 );
  #endif

  if( len1 > len2 ) return 1;
  else if ( len1 < len2 ) return -1;
  for( int i = 0; i < len1; ++i )
    {
      if( num1[i] - num2[i] )
	{
	  #ifdef DEBUG
	    printf( "= %d\n", (int)(num1[i] - num2[i]));
	  #endif
	  return num1[i] - num2[i];
	}
    }
  return printf("= 0\n"), 0;
}

int main(int argc,char** argv)
{
  char num[N_NUMBERS][NUMBER_MAX_LEN];
  unsigned n = 0;

  FILE* in = fopen("input.txt", "r");
  if( !in )
    {
      printf("file 'input.txt' not found.\n");
      return 1;
    }

  for( int i = 0; i < N_NUMBERS; ++i )
    {
      if( fscanf( in, "%s", &num[i][0]) > 0)
	++n;
      else
	break;
    }
  
  fclose(in);
  
  for( int i = 0; i < n; ++i )
    printf( "number #%d = %s\n", i, num[i] );

  char maximum[NUMBER_MAX_LEN];

  strcpy( maximum, num[0] );

  for( int i = 1; i < n; ++i )
    {
      if( cmp_nums( num[i], maximum ) > 0 )
	strcpy( maximum, num[i] );
    }

  printf( "\nmaximum = %s\n", maximum );
  return 0;
}



input.txt
Код: plaintext
1.
01234567895    0000000000000000000000000000000000000000000000000000000000000000000000000 1234567891     1234567892 123456 1234567899 000000000000000000000000009999



bash
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ziv@xozzo:~/x/c/bignum-cmp$ gcc -std=c99 -o bignum-cmp bignum-cmp.c  && ./bignum-cmp 
number #0 = 01234567895
number #1 = 0000000000000000000000000000000000000000000000000000000000000000000000000
number #2 = 1234567891
number #3 = 1234567892
number #4 = 123456
number #5 = 1234567899
number #6 = 000000000000000000000000009999

maximum = 1234567899
ziv@xozzo:~/x/c/bignum-cmp$ 
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38710465
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Тут есть один маленький вопрос, который реально может поставить все с ног на голову (навеяно Вавилонскими башнями и римскими процентами) - а числа записаны точно арабскими цифрами (хз, что там у вождей за письменность в компьютере)?

Это я так, в плане общего теоретизирования ;)
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38710470
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

MasterZivНо тебе надо "ускоряться" как-то что ли, чтобы восхищяться какими-то более серьёзными вещами.
А то, я боюсь, ты навосхищаешься, а на серьёзные вещи сил уже не останется.

Нет, я чувствую что Си и С++(так понимаю там наконец я смогу объединить функции с данными) это как футбол или математика, и то и другое мне нравится с пяти лет, ничего не изменилось C:


Не забыл про
Anatoly Moskovsky Напишите парсер С.



Это ведь хорошая, серьёзная задача, верно ?. Но я чувствую что нужно сначала разобрать деревья нормально и другие структуры данных. Но Кнута слишком быстро читать не получается, потому я пока не приступил. Но приступлю скоро.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38710471
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Поэтому хочу ещё раз напомнить про замечательную технику программирования, которую нам (мне лично и моим однокашникам) прививали с первого курса института, которая называется "контрольная печать" :
сразу после ввода данных они тут же распечатываются (делается их вывод) с целью контроля правильности ввода.

И эта техника полезна не только для начинающих. Я до сих пор периодически пользуюсь.

уф. Мне эта вещь нравится, но я думал что так делают только школьники, а оказывается это нормально и даже есть такой термин. Теперь смело буду использовать, спасибо за совет !
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38710485
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivПоэтому хочу ещё раз напомнить про замечательную технику программирования, которую нам (мне лично и моим однокашникам) прививали с первого курса института, которая называется "контрольная печать" :
сразу после ввода данных они тут же распечатываются (делается их вывод) с целью контроля правильности ввода.

И эта техника полезна не только для начинающих. Я до сих пор периодически пользуюсь.

уф. Мне эта вещь нравится, но я думал что так делают только школьники, а оказывается это нормально и даже есть такой термин. Теперь смело буду использовать, спасибо за совет !Есть только одна вещь которую делают только школьники: считают что все уже знают.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38710563
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача решена? Предлагаю топик закрыть и заняться самолётами. А девушки - потом.
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38711760
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyRWolf,
Вдогонку к вдогонке :)
Чтобы глаза не болели от компьютера их надо тренировать.
Самое лучшее - это сетевые игры стрелялки от первого лица, где много быстрых объектов и требуется хорошая реакция.
Рекомендую Wolfenstein Enemy Territory.


ахахахаха да вы шутите ?):DDD

mayton, да решена.
Спасибо всем за помощь C:

топ можно закрывать, не имею ничего против
...
Рейтинг: 0 / 0
Сравнение больших чисел. Не могу понять в чём ошибка.
    #38711928
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Закрыто
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение больших чисел. Не могу понять в чём ошибка.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]