免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4698 | 回复: 10

[C] 请帮助改动一下代码 [复制链接]

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-18 08:36 |显示全部楼层


哪位大牛有点时间?麻烦给改一下下面的代码

现在的下面代码是:只输出指定混合后的不重复字符的行

./floor42C dlup 8 200
SIZE  =    37619853.69 G
RANGE =    0 .. 201065
PARTX =    187.10 G



要求:改变成,输出指定混合后的所有字符的混合的行。(其中里面的,指定位数、预设数据大小及文件个数。不动,保持原样)


floor42C.c

  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>

  4. typedef char kar;
  5. typedef char *str;
  6. typedef double dub;
  7. typedef unsigned long long Int;

  8. int COLLECT;
  9. int SIZE;
  10. int LENDIT;
  11. int LENSTR;
  12. int HEAD;
  13. int *HAS;
  14. Int FINISH;
  15. Int MEKS;
  16. Int GLOB;
  17. str DAT;
  18. str DIT;
  19. str STR;

  20. void gene (int);
  21. void telle (int);
  22. void test (void);
  23. void explore (str);
  24. void help (str);
  25. void floor42 (int);
  26. void init (str *);
  27. void quit (int);
  28. /* ____________________ MAIN ____________________ */

  29. int main (int numa, str *para){
  30.     if (numa < 4 || numa > 5) help (para[0]);
  31.     init (para);
  32.     if (numa == 4) test ();
  33.     explore (para[4]);
  34. }

  35. /* _____________________ SUB _____________________ */
  36. void init (str *para){
  37.     COLLECT = atoi (para[2]);
  38.     SIZE    = atoi (para[3]);
  39.     LENDIT  = COLLECT + 1;
  40.     str this      = para[1];
  41.     int lenstr    = strlen (this);
  42.     str it        = "dlup";
  43.     int lenchar[] = { 10, 26, 26, 32 };
  44.     int len       = 0;
  45.     int pos       = 0;
  46.     str CHAR[]    = {
  47.         "0123456789",
  48.         "abcdefghijklmnopqrstuvwxyz",
  49.         "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
  50.         "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
  51.     };
  52.     int indes[4];

  53.     for (int i = 0; i < 4; i++) {
  54.         for (int j = 0; j < lenstr; j++) {
  55.             if (it[i] == this[j]) {
  56.                 len         += lenchar[i];
  57.                 indes[pos++] = i;
  58.                 break;
  59.             }
  60.         }
  61.     }

  62.     LENSTR = len;
  63.     STR = calloc (LENSTR + 1, sizeof(kar));
  64.     for (int i = 0; i < pos; i++)
  65.         strcat (STR, CHAR[indes[i]]);
  66. } /* init */

  67. void test (){
  68.     telle (1);
  69.     quit (0);
  70. }

  71. void quit (int n){
  72.     free (STR);
  73.     exit (n);
  74. }

  75. void explore (str part){
  76.     telle (0);
  77.     int n = atoi (part);
  78.     if (n < 0 || n > MEKS) {
  79.         printf ("ERROR: N = %d\t[N: 0 .. %llu]\n", n, MEKS);
  80.         quit (1);
  81.     }

  82.     kar dit[LENDIT];
  83.     dit[LENDIT - 1] = 0;
  84.     DIT             = dit;
  85.     int has[LENSTR];
  86.     HAS = has;
  87.     kar dat[LENSTR];
  88.     DAT = dat;
  89.     Int begin = GLOB * n;
  90.     Int end   = begin + GLOB;
  91.     if (end >= FINISH) end = FINISH + 1;

  92.     for (Int i = begin; i < end; i++) {
  93.         memset (has, 0, LENSTR * sizeof(int));
  94.         gene (i);
  95.         floor42 (HEAD);
  96.     }

  97.     free (STR);

  98. } /* explore */
  99. void telle (int TEST){
  100.     Int size = COLLECT + 1;
  101.     Int G    = 1024 * 1024 * 1024ULL;
  102.     Int max  = SIZE * G / size; // B
  103.     Int part = 1;
  104.     dub toto;

  105.     for (int i = LENSTR; i >= 0; i--) {
  106.         part *= i;
  107.         Int s = 1;
  108.         for (int j = i; j > LENSTR - COLLECT; j--) s *= j;
  109.         if (i == LENSTR) {
  110.             toto = s * size / (dub)G;
  111.             if (TEST) printf ("SIZE  =\t%.2f G\n", toto);
  112.         }
  113.         if (s <= max) {
  114.             HEAD   = LENSTR - i;
  115.             FINISH = part / i - 1;
  116.             dub partX = s * size / (dub)G;
  117.             GLOB = SIZE > toto ? 0 : SIZE / partX;
  118.             dub M1 = toto / (partX * GLOB);
  119.             Int M2 = M1;
  120.             MEKS = SIZE > toto ? FINISH : M2 - (M1 == M2);

  121.             if (GLOB) partX *= GLOB;
  122.             if (TEST) {
  123.                 printf ("RANGE =\t0 .. %llu\n", MEKS);
  124.                 printf ("PARTX =\t%.2f G\n", partX);
  125.             }

  126.             break;
  127.         }
  128.     }
  129. } /* telle */

  130. void gene (int n){
  131.     int low = LENSTR - HEAD + 1;
  132.     int mod[HEAD];

  133.     for (int i = 1; i <= HEAD; i++) {
  134.         int val = 1;
  135.         for (int j = low; j <= LENSTR - i; j++) val *= j;
  136.         mod[i - 1] = val;
  137.     }
  138.     int head[HEAD];
  139.     int posi[LENSTR];

  140.     memset (posi, 0, LENSTR * sizeof(int));

  141.     for (int i = 0; i < HEAD; i++) {
  142.         int val = n / mod[i];
  143.         int k   = 0;
  144.         for (int j = 0; j < LENSTR; j++) {
  145.             if (posi[j]) continue;
  146.             if (k++ == val) {
  147.                 posi[j] = 1;
  148.                 head[i] = j;
  149.                 DIT[i]  = STR[j];
  150.             }
  151.         }
  152.         n %= mod[i];
  153.     }

  154.     int h = HEAD;
  155.     for (int i = 0; i < LENSTR; i++) {
  156.         int ok = 1;
  157.         for (int j = 0; j < HEAD; j++)
  158.             if (i == head[j]) {
  159.                 ok--; break;
  160.             }

  161.         if (ok) DAT[h++] = STR[i];
  162.     }

  163. } /* gene */

  164. void floor42 (int indes){
  165.     if (indes == COLLECT) {
  166.         puts (DIT);
  167.         return;
  168.     }

  169.     for (int i = HEAD; i < LENSTR; i++) {
  170.         if (HAS[i]) continue;
  171.         HAS[i]     = 1;
  172.         DIT[indes] = DAT[i];
  173.         floor42 (indes + 1);
  174.         HAS[i] = 0;
  175.     }
  176. }

  177. void help (str app){
  178.     printf ("USE:\ntest:\n%s str chars size[G]\n", app);
  179.     printf ("%s dlu 8 6\n", app);
  180.     printf ("run:\n%s str chars size[G] part > partX\n", app);
  181.     printf ("%s dlu 8 6 0 > part0\n", app);
  182.     exit (1);
  183. }
复制代码





辛苦!





论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-21 10:15 |显示全部楼层

回复 1# rubyish



大牛

实在没法,只好打扰下,不礼貌请理解,谢谢!

好几天了,没人来回复(本不想打扰你的)。我不知道什么原因。猜想是难度大

请大牛有点功夫的时候,帮助

实在没时间就算了

又要辛苦一下!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-11-21 11:44 |显示全部楼层
回复 2# bmne

你连程序要干什么都不肯讲?(只说了要怎么改)
就是肯花5元钱去街边找个算命的瞎子,也猜不出来呀

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-21 12:09 |显示全部楼层
回复 3# bruceteen


谢谢回复

原来你没看明白啊(仔细看,应该是能明白的)。不好意思,抱歉

二楼的大牛,只是我不好意思打扰人家(实属无奈,才提人家的名字的)。他肯定能看明白的,因为一楼的代码是他写的



论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-11-23 01:03 |显示全部楼层
回复 1# bmne
KBD ~~
maybe:
  1. USE:        ./catalunya CHARS SIZE [PARTX]
  2. TEST:        ./catalunya 8 200
  3. RUN:        ./catalunya 8 200 0
复制代码

shishi ~~
catalunya.c:
  1. # include <stdio.h>
  2. # include <stdlib.h>

  3. typedef char MY;
  4. typedef unsigned My;
  5. typedef unsigned long long my;
  6. typedef struct { my glob, split, last; } our;

  7. My KARA, SIZE;
  8. our gimme (My);
  9. void explore (MY**);
  10. void pick (my, MY*);
  11. void help (MY*);

  12. # define TEST  (numa == 3)
  13. # define BAD(N) (atoi (para[N]) <= 0)
  14. # define ERROR (numa < 3) || BAD (1) || BAD (2)

  15. int main (int numa, MY **para){
  16.     if (ERROR) help (para[0]);
  17.     KARA = atoi (para[1]);
  18.     SIZE = atoi (para[2]);
  19.     if (TEST) gimme (5);
  20.     else explore (para);
  21. }
  22. /* _____________________ SUB _____________________ */

  23. # define SHRIEK  33
  24. # define TWIDDLE 126
  25. # define ELEM    94

  26. our gimme (My test){
  27.     my last = 1;

  28.     for (My i = 0; i < KARA; i++) last *= ELEM;
  29.     my sizeB = (KARA + 1) * last;
  30.     my sizeG = sizeB / (1024 * 1024 * 1024);
  31.     my glob  = SIZE * 1024 * 1024 * 1024LLU / (KARA + 1);
  32.     my split = sizeB / (glob * (KARA + 1));
  33.     if (SIZE >= sizeG) SIZE = sizeG, glob = last, split = 0;

  34.     if (test) {
  35.         printf ("\nSIZE  = %llu G\n", sizeG);
  36.         printf ("LINES = %llu\n", last);
  37.         printf ("RANGE = 0 .. %llu\n", split);
  38.         printf ("PARTX = %d G\n", SIZE);
  39.         printf ("LINE  = %llu\n\n", glob);
  40.     }
  41.     return (our) {glob, split, last };
  42. } /* gimme */

  43. void explore (MY **para){
  44.     if (atoi (para[3]) < 0) help (para[0]);
  45.     our dat  = gimme (0);
  46.     my split = atoi (para[3]);  // OK

  47.     if (split > dat.split) return;

  48.     my start = dat.glob * split;
  49.     MY this[KARA + 1];
  50.     pick (start, this);

  51.     My tail = KARA - 1;
  52.     my stop = start + dat.glob;
  53.     if (stop > dat.last) stop = dat.last;

  54.     for (my i = start; i < stop; i++) {
  55.         puts (this);
  56.         if (this[tail]++ < TWIDDLE) continue;
  57.         for (int j = tail; j >= 0; j--) {
  58.             if (this[j]++ < TWIDDLE) break;
  59.             else this[j] = SHRIEK;
  60.         }
  61.     }
  62. } /* explore */

  63. void pick (my indes, MY *kara){
  64.     my var[KARA];

  65.     var[KARA - 1] = 1;
  66.     for (int i = KARA - 2; i >= 0; i--)
  67.         var[i] = var[i + 1] * ELEM;
  68.     kara[0]        = SHRIEK + indes / var[0];
  69.     kara[KARA - 1] = SHRIEK + indes % ELEM;
  70.     kara[KARA]     = 0;
  71.     for (My i = 1; i < KARA - 1; i++)
  72.         kara[i] = SHRIEK + indes / var[i] % ELEM;

  73. }

  74. void help (MY *app){
  75.     printf ("\n[ CHARS > 0, SIZE > 0, PARTX >= 0 ]\n");
  76.     printf ("USE:\t%s CHARS SIZE [PARTX]\n", app);
  77.     printf ("TEST:\t%s 8 200\n", app);
  78.     printf ("RUN:\t%s 8 200 0\n", app);
  79.     exit (1);
  80. }

复制代码

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-23 05:49 |显示全部楼层
本帖最后由 bmne 于 2017-11-23 05:55 编辑

回复 5# rubyish



大牛

终于把你给盼来了

我的严重失误,让你辛苦了。我后悔中,对不起,对不起

是这样的:
必须人为按要求指定混合后的全部数据输出( 请注意,必须是按需要可以灵活指定混合   如   dl    du    dlu   lu   dlup   请参考floor42C.c中的第47行  )

假设我现在要求只有  纯数字+小写字母( 简称 dl )  的混合后的全部数据输出

你现在已有的 floor42C.c 实现不了我的要求
TEST:   ./floor42C dl 8 100
RUN:    ./floor42C dl 8 100 0      (这里只选单一    0    明白意思即可)
因为上面这个RUN,只是输出混合dl的不重复字符的8位的行


我现在的本帖子的要求是:输出8位混合后的全部数据的行,即,比如混合dl
TEST:   ./catalunya dl 8 100
RUN:    ./catalunya dl 8 100 0

请重新修改你现在的  catalunya.c    或  floor42C.c   来满足新的要求



(唉!我一楼想简单了,懊恼中)

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-11-23 23:22 |显示全部楼层
回复 6# bmne

zai shishi ~~

karachi.c
  1. # include "karachi.h"

  2. typedef struct { my glob, split, laast; } our;

  3. MY *TEMPLATE[] = {
  4.     "0123456789",                 
  5.     "abcdefghijklmnopqrstuvwxyz",
  6.     "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
  7.     "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
  8. };
  9. My LENTEM[] = { 10, 26, 26, 32 };
  10. My KARA, SIZE, ITEM;

  11. our gimme (My);
  12. sub explore ( MY**, My* );
  13. sub pick ( my, MY*, My*, MY* );
  14. sub help (MY*);
  15. sub init ( MY**, My* );

  16. # define TEST  ($numa == 4)
  17. # define BAD(N) (atoi($para[N]) <= 0)
  18. # define ERROR ($numa < 4) || BAD(2) || BAD(3)

  19. int main( int $numa, MY **$para ) {
  20.     if (ERROR) help( $para[0] );
  21.     My $indes[4] = { 4, 4, 4, 4 };
  22.     init( $para, $indes );
  23.     if (TEST) gimme(5);
  24.     else explore( $para, $indes );
  25. }
  26. /* _____________________ SUB _____________________ */

  27. sub init ( MY **$para, My *$indes ) {
  28.     KARA           = atoi( $para[2] );
  29.     SIZE           = atoi( $para[3] );
  30.     MY *$template  = $para[1];
  31.     My $lentem     = strlen($template);
  32.     MY *$it        = "dlup";
  33.     My $pos        = 0;

  34.     for ( My $i = 0; $i < 4; $i++ ) {
  35.         for ( My $j = 0; $j < $lentem; $j++ ) {
  36.             if ( $it[$i] == $template[$j] ) {
  37.                 ITEM += LENTEM[$i];
  38.                 $indes[ $pos++ ] = $i;
  39.                 last;
  40.             }
  41.         }
  42.     }
  43. }
  44. /* init */

  45. our gimme ( My $test ) {
  46.     my $laast = 1;

  47.     for ( My $i = 0; $i < KARA; $i++ ) $laast *= ITEM;
  48.     my $sizeB = ( KARA + 1 ) * $laast;
  49.     my $sizeG = $sizeB / ( 1024 * 1024 * 1024 );
  50.     my $glob  = SIZE * 1024 * 1024 * 1024LLU / ( KARA + 1 );
  51.     my $split = $sizeB / ( $glob * ( KARA + 1 ) );
  52.     if ( SIZE >= $sizeG ) SIZE = $sizeG, $glob = $laast, $split = 0;

  53.     if ($test) {
  54.         printf( "\nSIZE  = %llu G\n",  $sizeG );
  55.         printf( "LINES = %llu\n",      $laast );
  56.         printf( "RANGE = 0 .. %llu\n", $split );
  57.         printf( "PARTX = %d G\n",      SIZE );
  58.         printf( "LINE  = %llu\n\n",    $glob );
  59.     }
  60.     return (our) { $glob, $split, $laast };
  61. }
  62. /* gimme */

  63. sub explore ( MY **$para, My *$istr ) {
  64.     if ( atoi( $para[4] ) < 0 ) help( $para[0] );
  65.     our $dat = gimme(0);
  66.     my $split = atoi( $para[4] ); // OK

  67.     if ( $split > $dat.split ) return;
  68.     MY $template[ ITEM + 1 ];
  69.     $template[0] = 0;
  70.     for ( My $i = 0; $i < 4; $i++ ) {
  71.         if ( $istr[$i] == 4 ) last;
  72.         strcat( $template, TEMPLATE[ $istr[$i] ] );
  73.     }

  74.     my $start = $dat.glob * $split;
  75.     MY $this[ KARA + 1 ];
  76.     My $posi[KARA];
  77.     pick( $start, $this, $posi, $template );

  78.     My $tail = KARA - 1;
  79.     my $stop = $start + $dat.glob;
  80.     if ( $stop > $dat.laast ) $stop = $dat.laast;
  81.     My $end = ITEM - 1;
  82.     for ( my $i = $start; $i < $stop; $i++ ) {
  83.         say($this);
  84.         if ( $posi[$tail]++ < $end ) {
  85.             $this[$tail] = $template[ $posi[$tail] ];
  86.             next;
  87.         }
  88.         for ( int $j = $tail; $j >= 0; $j-- ) {
  89.             if ( $posi[$j]++ < $end ) {
  90.                 $this[$j] = $template[ $posi[$j] ];
  91.                 last;
  92.             }
  93.             else {
  94.                 $posi[$j] = 0;
  95.                 $this[$j] = $template[0];
  96.             }
  97.         }
  98.     }
  99. }
  100. /* explore */

  101. sub pick ( my $indes, MY *$kara, My *$posi, MY *$template ) {
  102.     my $var[KARA];

  103.     $var[ KARA - 1 ] = 1;
  104.     for ( int $i = KARA - 2; $i >= 0; $i-- )
  105.         $var[$i] = $var[ $i + 1 ] * ITEM;
  106.     $posi[0] = $indes / $var[0];
  107.     $posi[ KARA - 1 ] = $indes % ITEM;
  108.     for ( My $i = 1; $i < KARA - 1; $i++ )
  109.         $posi[$i] = $indes / $var[$i] % ITEM;
  110.     for ( My $i = 0; $i < KARA; $i++ )
  111.         $kara[$i] = $template[ $posi[$i] ];
  112.     $kara[KARA] = 0;
  113. }

  114. sub help (MY *$app) {
  115.     printf("\n[ CHARS > 0, SIZE > 0, PARTX >= 0 ]\n");
  116.     printf( "USE:\t%s TYPE CHARS SIZE [PARTX]\n", $app );
  117.     printf( "TEST:\t%s dlu 8 200\n",              $app );
  118.     printf( "RUN:\t%s dlu 8 200 0\n",             $app );
  119.     exit(1);
  120. }

复制代码


karachi.h:
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>
  4. typedef char MY;
  5. typedef unsigned My;
  6. typedef unsigned long long my;
  7. # define last break
  8. # define next continue
  9. # define say  puts
  10. # define sub  void
复制代码


karachi.c, karachi.h ==> same folder.

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-24 04:56 |显示全部楼层
本帖最后由 bmne 于 2017-11-24 05:20 编辑

回复 7# rubyish



大牛

还是那句话,你牛气冲天啊。大智若愚,技术严谨,追求完美,贴近老百姓,绝不炫技!

我敢相信,这个帖子,肯定又是一个经典!

截了一张图给大牛看看效率,快的吓死人。效率是我的最爱!

感谢感谢

我不编辑成255(这样做有点自私),还是敞开让喜欢看的人,进来能够看到此贴,找到各自的需求吧


(另外,我在此版块重新另发一贴,再次重新求助一个新问题,请继续帮助下
           只求助这一次,我保证若不是把我逼疯了,决不再张口第二次。我清楚求人不易,求大牛更难)



1.jpg

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-11-25 03:59 |显示全部楼层
回复 8# bmne

duiyu d, l, u, dlup you jiasu.

palermo.c:
  1. # include "palermo.h"

  2. MY *TEMPLATE[] = {
  3.     "0123456789",                 
  4.     "abcdefghijklmnopqrstuvwxyz",
  5.     "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
  6.     "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
  7. };
  8. My LENTEM[] = { 10, 26, 26, 32 };
  9. My KARA, SIZE, ITEM;

  10. # define TEST  ($numa == 4)
  11. # define BAD(N) (atoi ($para[N]) <= 0)
  12. # define ERROR ($numa < 4) || BAD(2) || BAD(3)

  13. int main( int $numa, MY **$para ) {
  14.     if (ERROR) help( $para[0] );
  15.     My $indes[] = { 4, 4, 4, 4 };
  16.     init( $para, $indes );
  17.     if (TEST) gimme(NULL);
  18.     else explore( $para, $indes );
  19. }
  20. /* _____________________ SUB _____________________ */

  21. sub init ( MY **$para, My *$indes ) {
  22.     KARA           = atoi( $para[2] );
  23.     SIZE           = atoi( $para[3] );
  24.     MY *$template  = $para[1];
  25.     My $lentem     = strlen($template);
  26.     MY *$it        = "dlup";
  27.     My $pos        = 0;

  28.     for ( My $i = 0; $i < 4; $i++ ) {
  29.         for ( My $j = 0; $j < $lentem; $j++ ) {
  30.             if ( $it[$i] == $template[$j] ) {
  31.                 ITEM += LENTEM [$i];
  32.                 $indes[ $pos++ ] = $i;
  33.                 last;
  34.             }
  35.         }
  36.     }
  37. }
  38. /* init */

  39. sub gimme (our *$dat) {
  40.     my $laast = 1;

  41.     for ( My $i = 0; $i < KARA; $i++ ) $laast *= ITEM;
  42.     my $sizeB = ( KARA + 1 ) * $laast;
  43.     my $sizeG = $sizeB / ( 1024 * 1024 * 1024 );
  44.     my $glob  = SIZE * 1024 * 1024 * 1024LLU / ( KARA + 1 );
  45.     my $split = $sizeB / ( $glob * ( KARA + 1 ) );
  46.     if ( SIZE >= $sizeG )
  47.         SIZE = $sizeG, $glob = $laast, $split = 0;

  48.     if ( !$dat ) {
  49.         printf( "\nSIZE  = %llu G\n",  $sizeG );
  50.         printf( "LINES = %llu\n",      $laast );
  51.         printf( "RANGE = 0 .. %llu\n", $split );
  52.         printf( "PARTX = %d G\n",      SIZE );
  53.         printf( "LINE  = %llu\n\n",    $glob );
  54.         return;
  55.     }
  56.    
  57.     *$dat = (our) { $glob, $split, $laast };
  58. } /* gimme */

  59. sub explore ( MY **$para, My *$istr ) {
  60.     if ( atoll( $para[4] ) < 0 ) help( $para[0] );
  61.     our $dat;
  62.     gimme(&$dat);
  63.     my $split = atoll( $para[4] ); // OK
  64.    
  65.     if ( $split > $dat.split ) return;

  66.     My $item = 0;
  67.     for ( My $i = 0; $i < 4; $i++ )
  68.         if ( $istr[$i] < 4 ) $item++;

  69.     my $start = $dat.glob * $split;
  70.     my $stop  = $start + $dat.glob;
  71.    
  72.     if ( $stop > $dat.laast ) $stop = $dat.laast;
  73.     Our $dit = { $start, $stop };
  74.    
  75.     if ( $item == 2 || $item == 3 || $istr[0] == 3 ) {
  76.         sub1( $dit, $istr );
  77.     }
  78.     else {
  79.         MY $head[] = { '0', 'a', 'A', '!' };
  80.         My $i = $item == 1 ? $istr[0] : 3;
  81.         sub2( $dit, $head[$i] );
  82.     }
  83. } /* explore */

  84. sub sub1 ( Our $dat, My *$istr ) {
  85.     MY $template[ ITEM + 1 ];

  86.     $template[0] = 0;
  87.     for ( My $i = 0; $i < 4; $i++ ) {
  88.         if ( $istr[$i] == 4 ) last;
  89.         strcat( $template, TEMPLATE[ $istr[$i] ] );
  90.     }

  91.     MY $this[ KARA + 1 ];
  92.     My $posi[KARA];
  93.     pick( $dat.start, $this, $posi, $template );

  94.     My $end  = ITEM - 1;
  95.     My $tail = KARA - 1;

  96.     for ( my $i = $dat.start; $i < $dat.stop; $i++ ) {
  97.         say($this);
  98.         if ( $posi[$tail]++ < $end ) {
  99.             $this[$tail] = $template[ $posi[$tail] ];
  100.             next;
  101.         }
  102.         for ( int $j = $tail; $j >= 0; $j-- ) {
  103.             if ( $posi[$j]++ < $end ) {
  104.                 $this[$j] = $template[ $posi[$j] ];
  105.                 last;
  106.             }
  107.             else {
  108.                 $posi[$j] = 0;
  109.                 $this[$j] = $template[0];
  110.             }
  111.         }
  112.     }
  113. } /* sub1 */

  114. sub sub2 ( Our $dat, MY $A) {
  115.     MY $template[ITEM];

  116.     for ( My $i = 0; $i < ITEM; $i++ )
  117.         $template[$i] = $A + $i;

  118.     MY $this[ KARA + 1 ];
  119.     My $posi[KARA];
  120.     pick( $dat.start, $this, $posi, $template );
  121.     MY $B    = $A + ITEM - 1;
  122.     My $tail = KARA - 1;
  123.     for ( my $i = $dat.start; $i < $dat.stop; $i++ ) {
  124.         say($this);
  125.         if ( $this[$tail]++ < $B ) next;
  126.         for ( int $j = $tail; $j >= 0; $j-- ) {
  127.             if ( $this[$j]++ < $B ) last;
  128.             else $this[$j] = $A;
  129.         }
  130.     }
  131. } /* sub2 */

  132. sub pick ( my $indes, MY *$kara, My *$posi, MY *$template ) {
  133.     my $var[KARA];

  134.     $var[ KARA - 1 ] = 1;
  135.     for ( int $i = KARA - 2; $i >= 0; $i-- )
  136.         $var[$i] = $var[ $i + 1 ] * ITEM;

  137.     $posi[0] = $indes / $var[0];
  138.     $posi[ KARA - 1 ] = $indes % ITEM;

  139.     for ( My $i = 1; $i < KARA - 1; $i++ )
  140.         $posi[$i] = $indes / $var[$i] % ITEM;
  141.     for ( My $i = 0; $i < KARA; $i++ )
  142.         $kara[$i] = $template[ $posi[$i] ];
  143.     $kara[KARA] = 0;
  144. }

  145. sub help (MY *$app) {
  146.     printf( "\n[ CHARS > 0, SIZE > 0, PARTX >= 0 ] \n" );
  147.     printf( "USE:\t%s TYPE CHARS SIZE [PARTX]\n", $app );
  148.     printf( "TEST:\t%s dlu 8 200\n",              $app );
  149.     printf( "RUN:\t%s dlu 8 200 0\n",             $app );
  150.     exit(1);
  151. }

复制代码

palermo.h:
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>

  4. typedef char MY;
  5. typedef unsigned My;
  6. typedef unsigned long long my;
  7. typedef struct { my glob, split, laast; } our;
  8. typedef struct { my start, stop; } Our;

  9. # define last break
  10. # define next continue
  11. # define say  puts
  12. # define sub  void

  13. sub gimme (our*);
  14. sub explore (MY**, My*);
  15. sub sub1 (Our, My*);
  16. sub sub2 (Our, MY);
  17. sub pick (my, MY*, My*, MY*);
  18. sub help (MY*);
  19. sub init (MY**, My*);


复制代码

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2017-11-25 07:31 |显示全部楼层
回复 9# rubyish


谢谢大牛的完美

感动

刚试了下。仍然继续测试纯数字,估计硬件的限制,感觉提速不明显了。辛苦!

到此吧。这个速度效率已经打败我知道的所有各种形式的代码(包括收费的软件)  no.1

谢谢、谢谢!

1.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP