LINUX.ORG.RU

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

Исправление saahriktu, (текущая версия) :

Для выделения подстрок? Нет там необходимости считать. И даже для последовательного вывода строк нет необходимости считать. Можно обходиться и без объединения строк. Пример:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv){
        long long x, d = 2;
        char llbuf[64];
        if(argc < 2){
                printf("usage: fmdl number\n");
                return 1;
        }
        x = atoll(argv[1]);
        fputs(argv[1], stdout);
        fputs(" = ", stdout);
        while (d <= x){
                if(x%d == 0){
                        sprintf(llbuf, "%ld", d);
                        fputs(llbuf, stdout);
                        if(x != d) fputs(" * ", stdout);
                        x /= d;
                        d = 2;
                        continue;
                }
                d++;
        }
        putchar(';');
        putchar('\n');
        return 0;
}
Эта программа раскладывает число на множители и выводит всё это одной строкой вида
52952148 = 2 * 2 * 3 * 3 * 61 * 24113;
И при этом обходится без создания буфера под эту строку и последовательного объединения кучи строк в этот буфер.

Исправление saahriktu, :

Для выделения подстрок? Нет там необходимости считать. И даже для последовательного вывода строк нет необходимости считать. Можно обходиться и без объединения строк. Пример:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv){
        long long x, d = 2;
        char llbuf[64];
        if(argc < 2){
                printf("usage: fmdl number\n");
                return 1;
        }
        x = atoll(argv[1]);
        fputs(argv[1], stdout);
        fputs(" = ", stdout);
        while (d <= x){
                if(x%d == 0){
                        sprintf(llbuf, "%ld", d);
                        fputs(llbuf, stdout);
                        if(x != d) fputs(" * ", stdout);
                        x /= d;
                        d = 2;
                        continue;
                }
                d++;
        }
        putchar(';');
        putchar('\n');
        return 0;
}
Эта программа раскладывает число на множители и выводит всё это одной строкой вида
52952148 = 2 * 2 * 3 * 3 * 61 * 24113;
И при это обходится без создания буфера под эту строку и последовательного объединения кучи строк в этот буфер.

Исходная версия saahriktu, :

Для выделения подстрок? Нет там необходимости считать. И даже для последовательного вывода строк нет необходимости считать. Можно обходиться и без объединения строк. И вообще без дополнительных буферов обходиться можно. Пример:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv){
        long long x, d = 2;
        char llbuf[64];
        if(argc < 2){
                printf("usage: fmdl number\n");
                return 1;
        }
        x = atoll(argv[1]);
        fputs(argv[1], stdout);
        fputs(" = ", stdout);
        while (d <= x){
                if(x%d == 0){
                        sprintf(llbuf, "%ld", d);
                        fputs(llbuf, stdout);
                        if(x != d) fputs(" * ", stdout);
                        x /= d;
                        d = 2;
                        continue;
                }
                d++;
        }
        putchar(';');
        putchar('\n');
        return 0;
}
Эта программа раскладывает число на множители и выводит всё это одной строкой вида
52952148 = 2 * 2 * 3 * 3 * 61 * 24113;
И при это обходится без создания буфера под эту строку и последовательного объединения кучи строк в этот буфер.