您的位置:首页 > 其它

IT公司笔试题算法部分(二)

2007-05-08 23:17 537 查看
 
[align=left]9、有4种[b]面值(面值为1, 4, 12, 21)的邮票很多枚,从中最多任取5张进行组合,求邮票最大连续组合值[/b][/align]
[align=left]#define N 5[/align]
[align=left]#define M 5[/align]
int k, Found, Flag
;
[align=left]int Stamp[M] = {0, 1, 4, 12, 21};[/align]
[align=left] [/align]
[align=left]// 在剩余张数n中组合出面值和Value[/align]
[align=left]int Combine(int n, int Value)[/align]
[align=left]{[/align]
[align=left]     if(n >= 0 && Value == 0){[/align]
[align=left]         Found = 1;[/align]
[align=left]         int Sum = 0;[/align]
[align=left]         for(int i=0; i<N && Flag[i] != 0; i++){[/align]
[align=left]              Sum += Stamp[Flag[i]];[/align]
[align=left]              printf("%d ", Stamp[Flag[i]]);[/align]
[align=left]         }[/align]
[align=left]         printf("/tSum=%d/n/n", Sum);[/align]
[align=left]     }else for(int i=1; i<M && !Found && n>0; i++)[/align]
[align=left]         if(Value-Stamp[i] >= 0){[/align]
[align=left]              Flag[k++] = i;[/align]
[align=left]              Combine(n-1, Value-Stamp[i]);[/align]
[align=left]              Flag[--k] = 0;[/align]
[align=left]         }[/align]
[align=left]     return Found;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     for(int i=1; Combine(N, i); i++, Found=0);[/align]
[align=left]     return getchar();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]10、大整数数相乘的问题。[/align]
[align=left]void Multiple(char A[], char B[], char C[])[/align]
[align=left]{[/align]
[align=left]    int TMP, In=0, LenA=-1, LenB=-1;[/align]
[align=left]    while(A[++LenA] != '/0');[/align]
[align=left]    while(B[++LenB] != '/0');[/align]
[align=left]    int Index, Start = LenA + LenB - 1;[/align]
[align=left]    for(int i=LenB-1; i>=0; i--)[/align]
[align=left]    {[/align]
[align=left]        Index = Start--;[/align]
[align=left]        if(B[i] != '0'){[/align]
[align=left]            for(int In=0, j=LenA-1; j>=0; j--)[/align]
[align=left]            {[/align]
[align=left]                TMP = (C[Index]-'0') + (A[j]-'0') * (B[i] - '0') + In;[/align]
[align=left]                C[Index--] = TMP % 10 + '0';[/align]
[align=left]                In = TMP / 10;[/align]
[align=left]            }[/align]
[align=left]            C[Index] = In + '0';[/align]
[align=left]        }[/align]
[align=left]    }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]    char A[] = "21839244444444448880088888889";[/align]
[align=left]    char B[] = "38888888888899999999999999988";[/align]
[align=left]char C[sizeof(A) + sizeof(B) - 1];[/align]
[align=left] [/align]
[align=left]    for(int k=0; k<sizeof(C); k++)[/align]
[align=left]        C[k] = '0';[/align]
[align=left]    C[sizeof(C)-1] = '/0';[/align]
[align=left] [/align]
[align=left]    Multiple(A, B, C);[/align]
[align=left]    for(int i=0; C[i] != '/0'; i++)[/align]
[align=left]        printf("%c", C[i]);[/align]
[align=left]    return getchar();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]11、求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)[/align]
[align=left]int GetSubString(char *strSource, char *strResult)[/align]
[align=left]{[/align]
[align=left]    int iTmp=0, iHead=0, iMax=0;[/align]
[align=left]    for(int Index=0, iLen=0; strSource[Index]; Index++)[/align]
[align=left]    {[/align]
[align=left]        if(strSource[Index] >= '0' && strSource[Index] <= '9' [/align]
[align=left]&& strSource[Index-1] > '0' && strSource[Index] == strSource[Index-1]+1)[/align]
[align=left]{[/align]
[align=left]            iLen++;                    // 连续数字的长度增1 [/align]
[align=left]        }else{                          // 出现字符或不连续数字[/align]
[align=left]            if(iLen > iMax)[/align]
[align=left]            {[/align]
[align=left]            iMax = iLen; [/align]
[align=left]iHead = iTmp; [/align]
[align=left]            }        [/align]
[align=left]           [/align]
[align=left]            // 该字符是数字,但数字不连续[/align]
[align=left]            if(strSource[Index] >= '0' && strSource[Index] <= '9'){ [/align]
[align=left]                iTmp = Index; [/align]
[align=left]iLen = 1; [/align]
[align=left]            }[/align]
[align=left]        }    [/align]
[align=left]    }[/align]
[align=left]        [/align]
[align=left]    for(iTmp=0 ; iTmp < iMax; iTmp++) // 将原字符串中最长的连续数字串赋值给结果串[/align]
[align=left]        strResult[iTmp] = strSource[iHead++];[/align]
[align=left]    strResult[iTmp]='/0';[/align]
[align=left]    return iMax;                      // 返回连续数字的最大长度[/align]
[align=left]}[/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]    char strSource[]="ads3sl456789DF3456ld345AA", char strResult[sizeof(strSource)];[/align]
[align=left]printf("Len=%d, strResult=%s /nstrSource=%s/n", GetSubString(strSource, strResult), [/align]
[align=left]strResult, strSource);[/align]
[align=left]    return getchar();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]12、四个工人,四个任务,每个人做不同的任务需要的时间不同,求任务分配的最优方案。(2005年5月29日全国计算机软件资格水平考试——软件设计师的算法题)。[/align]
[align=left]#include "stdafx.h"[/align]
[align=left]#define N 4[/align]
int Cost

= { {2, 12, 5, 32},       // 行号:任务序号,列号:工人序号
[align=left]                    {8, 15, 7, 11},       // 每行元素值表示这个任务由不同工人完成所需要的时间[/align]
[align=left]                    {24, 18, 9, 6},[/align]
[align=left]                    {21, 1, 8, 28}};[/align]
[align=left]int MinCost=1000;[/align]
int Task
, TempTask
, Worker
;
[align=left]void Assign(int k, int cost)[/align]
[align=left]{[/align]
[align=left]     if(k==N)[/align]
[align=left]     {[/align]
[align=left]         MinCost = cost;    [/align]
[align=left]         for(int i=0; i<N; i++)[/align]
[align=left]              TempTask[i] = Task[i];[/align]
[align=left]     }else{[/align]
[align=left]         for(int i=0; i<N; i++){ [/align]
[align=left]              if(Worker[i]==0 && cost+Cost[k][i] < MinCost)[/align]
[align=left]              {[/align]
[align=left]                   Worker[i] = 1;     Task[k] = i; [/align]
[align=left]                   Assign(k+1, cost+Cost[k][i]); [/align]
[align=left]                   Worker[i] = 0; Task[k] = 0;[/align]
[align=left]              }[/align]
[align=left]         }[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     Assign(0, 0);[/align]
[align=left]     printf("最佳方案总费用=%d/n", MinCost);[/align]
[align=left]     for(int i=0; i<N; i++)      /* 输出最佳方案 */[/align]
[align=left]         printf("/t任务%d由工人%d来做:%d/n", i, TempTask[i], Cost[i][TempTask[i]]);[/align]
[align=left]     return getchar();      [/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]13、八皇后问题(输出所有情况,不过有些结果只是旋转了90度而已)。哈哈:)回溯算法的典型例题[/align]
[align=left]#define N 8[/align]
int Board

;
[align=left]int Valid(int i, int j)     // 所下棋子有效性的严正[/align]
[align=left]{[/align]
[align=left]     int k = 1;[/align]
[align=left]     for(k=1; i>=k && j>=k;k++)[/align]
[align=left]         if(Board[i-k][j-k])    return 0;[/align]
[align=left]     for(k=1; i>=k;k++)[/align]
[align=left]         if(Board[i-k][j])      return 0;[/align]
[align=left]     for(k=1; i>=k && j+k<N;k++)[/align]
[align=left]         if(Board[i-k][j+k])    return 0;[/align]
[align=left]     return 1;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]void Trial(int i, int n)[/align]
[align=left]{[/align]
[align=left]     if(i==n){[/align]
[align=left]          for(int k=0; k<n; k++){[/align]
[align=left]              for(int m=0; m<n; m++)[/align]
[align=left]                   printf("%d ", Board[k][m]);[/align]
[align=left]              printf("/n");[/align]
[align=left]         }[/align]
[align=left]         printf("/n");[/align]
[align=left]     }else{[/align]
[align=left]         for(int j=0; j<n; j++){[/align]
[align=left]              Board[i][j] = 1;[/align]
[align=left]              if(Valid(i,j))[/align]
[align=left]                   Trial(i+1, n);[/align]
[align=left]              Board[i][j] = 0;[/align]
[align=left]         }[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     Trial(0, N);[/align]
[align=left]     return getchar();[/align]
[align=left]}[/align]
[align=left]14、实现strstr功能(寻找子串在父串中首次出现的位置)[/align]
[align=left]char * strstring(char *ParentString, char *SubString)[/align]
[align=left]{[/align]
[align=left]     char *pSubString, *pPareString;[/align]
[align=left]     for(char *pTmp=ParentString; *pTmp; pTmp++)[/align]
[align=left]     {[/align]
[align=left]         pSubString = SubString;[/align]
[align=left]         pPareString = pTmp;    [/align]
[align=left]         while(*pSubString == *pPareString && *pSubString != '/0')[/align]
[align=left]         {[/align]
[align=left]              pSubString++;[/align]
[align=left]              pPareString++;[/align]
[align=left]         }[/align]
[align=left]         if(*pSubString == '/0')     return pTmp;[/align]
[align=left]     }[/align]
[align=left]     return NULL;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left]     char *ParentString = "happy birthday to you!";[/align]
[align=left]     char *SubString = "birthday";[/align]
[align=left]     printf("%s",strstring(ParentString, SubString));[/align]
[align=left]     return getchar();[/align]
[align=left]}}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 任务 c null im