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]
相关文章推荐
- [转]IT公司笔试题算法部分
- 部分IT公司笔试算法题
- 部分IT公司笔试算法题(转)
- 部分it公司的笔试小算法题精选
- 转:部分IT公司笔试算法题
- IT公司笔试题算法部分
- 部分IT公司笔试算法题
- 部分it公司的笔试小算法题精选
- 部分IT公司笔试算法题
- 部分it公司算法的笔试题
- 【收集】IT公司笔试算法题
- IT公司笔试算法题
- 某IT公司测试实习生线上笔试的部分题目
- 部分网络公司校招笔试题 详解
- 2011 各大IT公司笔试面试题目
- IT公司笔试题总结(二)
- 2011各大IT公司笔试面试题目
- 如何判断两个矩形是否有重叠部分?(某公司校园招聘笔试试题)
- 待续--著名软件公司笔试算法题:122345排列组合
- 各大IT公司笔试题