_par,
| Цитата | есть строка "123456" мне надо по символьно их переделывать в int.
|
заюзать atoi не получится - так как по синтаксису надо передавать указатель на строку, или адрес первого элемента, т.е. в твоём случае что-то типа
or
| Код | for (int i = 0; i < strlen(str); i++) printf("%i ", atoi(&str[i]));
|
Но это не подойдёт, т.к. преобразуется вся строка, т.е. у тебя получится число, равное 12345; Вот возможный вариант решения:
| Код | for (int i = 0; i < strlen(str); i++) printf("%i ", str[i] - 48);
|
Дело в том, что разница в ASCII между символом '0' и цифрой 0 равна 48, а значит и между всеми цифрами.
| Цитата | 1.Как перевести из числа в строку.
|
Перевести из числа в строку можно, например так: выделить все цифры числа и копировать в массив чаров, прибавляя число 48. Но это как-то марудно, сейчас ещё подумаю, может найду чего.
| Цитата | 2.Как хранить очень большие числа которые не влазят не в один тип,вродебы в масиве чаров, но непонимаю как патом таким числом пользоваться.
|
Для хранения больших чисел (кстати, чем тебя не устраивает __int64 ??? Диапазон значений от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807. Синтаксис такой: scanf("%I64d", &a)) используется так называемая длинная арифметика. Считываем из файла символы, на ходу преобразовывая их в числа. Затем переворачиваем массив, т.е. в нулевом элементе у нас хранится размер массива, в 1-ом - единицы, во 2-ом - десятки и т.д. Далее выполняешь все действия, как тебя учили в школе - т.е. столбиком) Вот пример моего исходника для пары операций:
| Код | #include <stdio.h> #include <ctype.h> #include <mem.h> #include <time.h>
double start = (double)clock();
FILE* in = fopen("input.txt", "r"); FILE* out = fopen("output.txt", "w");
const int MAX = 200;
void GetNum(int* rhs) { *rhs = 0; char ch = '\0'; while (!isdigit(ch)) ch = getc(in); while (isdigit(ch)) { *(rhs + ++(*rhs)) = ch - 48; ch = getc(in); } }
void Revert(int* rhs) { for(register int i = 0; i < *rhs / 2; i++) { int tmp = *(rhs + i + 1); *(rhs + i + 1) = *(rhs + *rhs - i); *(rhs + *rhs - i) = tmp; } }
// Если первое больше, возвращаем true bool Compare(int* f, int* s) { if (*f > *s) return true; if (*f < *s) return false; for(register int i = *f; i > 0; i--) if (*(f + i) < *(s + i)) return false; return true; }
void Shift(int* rhs) { for(register int i = 1; i <= *rhs; i++) if (*(rhs + i) > 9) { *(rhs + i + 1) += (*(rhs + i) / 10); *(rhs + i) %= 10; if (i == *rhs) (*rhs)++; } }
void Plus(int* f, int* s, int* rhs) { int* min = *f > *s ? s : f; int* max = *f > *s ? f : s; *rhs = *max; for(register int i = 1; i <= *min; i++) *(rhs + i) = *(f + i) + *(s + i); for(register int i = *min + 1; i <= *max; i++) *(rhs + i) = *(max + i); Shift(rhs); }
void Minus(int* f, int* s, int* rhs) { // Revert(f); // Revert(s); int* max = NULL; int* min = NULL; if (Compare(f, s)) { max = f; min = s; } else { max = s; min = f; } *rhs = *max; for(register int i = 1; i <= *max; i++) { *(rhs + i) = *(max + i) - *(min + i); if (*(rhs + i) < 0) { (*(max + i + 1))--; *(rhs + i) += 10; } } while (!*(rhs + *rhs) && *rhs) (*rhs)--; }
void Initialize(int* f, int* s, int* res) { memset(f, 0, sizeof(int) * MAX); memset(s, 0, sizeof(int) * MAX); memset(res, 0, sizeof(int) * MAX); }
void Output(int* rhs) { if (!(*rhs)) fprintf(out, "0"); else for(register int i = *rhs; i > 0; i--) fprintf(out, "%i", *(rhs + i)); }
int main() { int* f = new int[MAX]; int* s = new int[MAX]; int* res = new int[MAX]; Initialize(f, s, res); GetNum(f); GetNum(s); Revert(f); Revert(s); Plus(f, s, res); fprintf(out, "The Plus is:\n"); Output(res); memset(res, 0, sizeof(int) * MAX); Minus(f, s, res); fprintf(out, "\n\nThe Minus is:\n"); Output(res); delete [] res; delete [] f; delete [] s; fprintf(out, "\nThe time was: %f seconds.", (clock() - start) / CLK_TCK); _fcloseall(); return 0; }
|
По работе с массивами - RTFM
Не совсем понимаю ,что ты имеешь в виду под | Цитата | 4.Как считывать из файла по строчно , есть например строка "123 321 321" как мне её разбить на отдельные переменные, ну есть что нибудь наподобии php-ешного explode(); ?
|
|