一.俗话说算法是程序的灵魂,这下面本人写了一部分常用算法,欢迎大家使用,并提出批评和指正,当然也可以改进或者添加。
1.这是自己实现的算法库头文件
#ifndef _INC_ALGORITHM #define _INC_ALGORITHM #endif #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<math.h> #include<time.h> #include<string.h> /* 本算法库封装了大多数常用算法,一部分摘取书籍,大部分为自己动手编写, 大部分经过测试,可以直接使用,如有错误,欢迎指正,使用请尊重作者的成果,注明出处。 注意:除了windows操作算法,其他都是跨平台的,本算法库在windows 8.1的VS2013上测试通过 学校:长安大学 作者:惠鹏博 时间:2017/5/25 算法包括: 1.排序类算法 2.数学类算法 3.逻辑类算法 4.Windosw操作算法 5.字符串算法 6.经典算法 7.数据结构算法 8.文件操作算法 */ /********************************************排序类算法********************************************/ /*二分查找法,上,中,下,前提数组必须有序找到返回0否则返回-1*/ int binerySearch(char **p, int count, char *des); /********************************************数学类算法********************************************/ /*乘法表打印方形*/ void print9X9Table(); /*乘法表打印反对角线以下*/ void print9X9Table1(); /*乘法表打印反对角线以上*/ void print9X9Table2(); /*乘法表打印正对角线以上*/ void print9X9Table3(); /*乘法表打印反对角线以下*/ void print9X9Table4(); /*乘法表打印反对角线上的*/ void print9X9Table5(); /*乘法表打印正对角线上的*/ void print9X9Table6(); /*乘法表打印两条对角线上部的*/ void print9X9TableUp(); /*乘法表打印两条对角线下部的*/ void print9X9TableDown(); /*乘法表打印两条对角线左边的*/ void print9X9TableLeft(); /*乘法表打印两条对角线右边的的*/ void print9X9TableRight(); /*求2的N次方*/ int T2n(int N); /*求2的一次方到2的N次方的和*/ int S2n(int N); /*求两个数的最大公因数 a > b*/ int maxCommonFactor(int a, int b); /*求两个数的最小公倍数*/ int minCommonDouble(int a, int b); /*获取N以下的质数,并按从小到大的顺序存放到数组P中,L为L为存放质数个数地址*/ void getPrimeNumTable(int N, int *P, int *L); /*求一个数的所有质因数,并按从小到大的顺序存放到数组P中,L为存放质因数个数地址,F为中间获取质数的数组表,T为存储质数数组长度的变量*/ int getFactor(int m, int *P, int *F, int *L, int *T); /*使用递归10进制转0进制打印*/ void PrintBin(int n); /*二进制整数转十进制,接受一个二进制字符串,将它转为10进制整数数*/ int BinToDec(char *bin); /*十进制整数转二进制字符串*/ char *DecToBin(int num, char *s); /*求一个数对另一个数的余数,不使用求模运算符*/ int YuNum(int a, int b); /*求一个整数的翻转*/ int ReverseInt(int num); /*取出一个整数的每个位,存入到一个数组中,第一个为个位,依次类推*/ int GetIntBit(int num, int bit[]); /*产生一个N之内的随机数*/ int RandomNumber(int N); /*判断一个n位数num是不是水仙花数,每一位的数字由低到高存入bit数组中*/ int searchNumber(int num, int n, int bit[]); /*生成n个小于m的随机数,并将生成的随机数存放到数组p中*/ void randNumber(int *p, int n, int m); /********************************************逻辑问题类算法****************************************/ /************************四字节操作,如int ,long等类型**********************/ /*置位int数num的第N个位*/ void setInt(int *num, int N); /*清零int数num的第N个位*/ void clearInt(int *num, int N); /*统计num中是1的位数,返回位数*/ int statIntOne(int num); /*统计num中是0的位数,返回位数*/ int statIntZero(int num); /*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/ int reverseInt(int *num); /*以二进制形式打印一个整数*/ void printfIntBinary(int num); /*循环左移位的实现num左移N位*/ int moveToLeft(int num, int N); /*循环右移位的实现num右移N位*/ int moveToRight(int num, int N); /*使用位运算异或实现两个变量值的交换*/ void exchange(int *a, int *b); /*获取int数num的第N个位的值,0或1*/ int getIntBit(int num, int N); /*打印一个int数在内存中的二进制码*/ void printfBinCode(int num); /*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/ void printfSrcCode(int num); /*打印一个unsigned char 类型的二进制码*/ void printfCharCode(unsigned char s); /*打印一个浮点数的二进制码*/ void printfFloatCode(float f); /*********************************************Windows操作算法******************************************/ /*模拟鼠标单击*/ void SingleClick(); /*模拟鼠标双击*/ void DoubleClick(); /*模拟鼠标右击*/ void RightClick(); /*Left mouse button键的模拟*/ void LeftMouseButton(); /*Right mouse button键的模拟*/ void RightMouseButton(); /*Control-break processing键的模拟*/ void Cancle(); /*鼠标中键的模拟*/ void MiddleButton(); /*backspace键的模拟*/ void Backspace(); /*TAB key键的模拟*/ void Tab(); /*CLEAR key键的模拟*/ void ClearKey(); /*ENTER回车键 key键的模拟*/ void Enter(); /*SHIFT key键的模拟*/ void Shift(); /*CTRL key键的模拟*/ void Ctrl(); /*ALT key键的模拟*/ void Alt(); /*PAUSE key键的模拟*/ void Pause(); /*CAPS LOCK key键的模拟*/ void CapsLock(); /*ESC key键的模拟*/ void Esc(); /*SPACE空格 key键的模拟*/ void Space(); /*PAGE UP key键的模拟*/ void PageUp(); /*PAGE DOWN key键的模拟*/ void PageDown(); /*END key键的模拟*/ void End(); /*Home key键的模拟*/ void Home(); /*LEFT ARROW key键的模拟*/ void LeftArrow(); /*RIGHT ARROW key键的模拟*/ void RightArrow(); /*UP ARROW key键的模拟*/ void UpArrow(); /*DOWN ARROW key键的模拟*/ void DownArrow(); /*SELECT key键的模拟*/ void Select(); /*EXECUTE key键的模拟*/ void Execute(); /*PRINT SCREEN key键的模拟*/ void PrintScreen(); /*INSERT key键的模拟*/ void Insert(); /*DELETE key键的模拟*/ void Delete(); /*HELP key键的模拟*/ void Help(); /*Left Windows key键的模拟*/ void LeftWin(); /*Right Windows key键的模拟*/ void RightWin(); /*0 key键的模拟*/ void NumberThero(); /*1 key键的模拟*/ void NumberOne(); /*2 key键的模拟*/ void NumberTwo(); /*3 key键的模拟*/ void NumberThree(); /*4 key键的模拟*/ void NumberFour(); /*5 key键的模拟*/ void NumberFive(); /*6 key键的模拟*/ void NumberSix(); /*7 key键的模拟*/ void NumberSeven(); /*8 key键的模拟*/ void NumberEight(); /*9 key键的模拟*/ void NumbeNine(); /*乘号 key键的模拟*/ void Multiply(); /*加号 key键的模拟*/ void Add(); /*减号 Subtractkey键的模拟*/ void Subtract(); /*除号 /键的模拟*/ void Divide(); /*Separator 分隔符 键的模拟*/ void Separator(); /*F1键的模拟*/ void F1(); /*F2键的模拟*/ void F2(); /*F3键的模拟*/ void F3(); /*F4键的模拟*/ void F4(); /*F5键的模拟*/ void F5(); /*F6键的模拟*/ void F6(); /*F7键的模拟*/ void F7(); /*F8键的模拟*/ void F8(); /*F9键的模拟*/ void F9(); /*F10键的模拟*/ void F10(); /*F11键的模拟*/ void F11(); /*F12键的模拟*/ void F12(); /*F13键的模拟*/ void F13(); /*F14键的模拟*/ void F14(); /*F15键的模拟*/ void F15(); /*F16键的模拟*/ void F16(); /*NUM LOCK键的模拟*/ void NumLock(); /* ";:" 键的模拟*/ void ColonAndSemicolon(); /* "+ =" 键的模拟*/ void PlusEquals(); /* "," 键的模拟*/ void Comma(); /* "- _" 键的模拟*/ void MinusHyphen(); /* "." 键的模拟*/ void Point(); /* "/ ?" 键的模拟*/ void Question(); /* "` ~" 键的模拟*/ void BoLangHao(); /* "[ {" 键的模拟*/ void LeftBrackets(); /* " |" 键的模拟*/ void VerticalLine(); /* "] }" 键的模拟*/ void RightBrackets(); /* "' "" 键的模拟*/ void YinHao(); /*win键的模拟*/ void win(); /*win+d键的组合模拟*/ void winAndD(); /*win+E键的组合模拟*/ void winAndE(); /*win+M键的组合模拟*/ void winAndM(); /*CTRL+ALT+DEL键的组合模拟*/ void ctrlAndAltAndDel(); /****************z26个字母键模拟*************************/ /*A键模拟*/ void AKey(); /*B键模拟*/ void BKey(); /*C键模拟*/ void CKey(); /*D键模拟*/ void DKey(); /*E键模拟*/ void EKey(); /*F键模拟*/ void FKey(); /*G键模拟*/ void GKey(); /*H键模拟*/ void HKey(); /*I键模拟*/ void IKey(); /*J键模拟*/ void JKey(); /*K键模拟*/ void KKey(); /*L键模拟*/ void LKey(); /*M键模拟*/ void MKey(); /*N键模拟*/ void NKey(); /*O键模拟*/ void OKey(); /*P键模拟*/ void PKey(); /*Q键模拟*/ void QKey(); /*R键模拟*/ void RKey(); /*S键模拟*/ void SKey(); /*T键模拟*/ void TKey(); /*U键模拟*/ void UKey(); /*V键模拟*/ void VKey(); /*W键模拟*/ void WKey(); /*X键模拟*/ void XKey(); /*Y键模拟*/ void YKey(); /*Z键模拟*/ void ZKey(); /*********************************************字符串算法*********************************************/ /*自己实现的字符串检索函数,s2为要检索的字符串,s1位源字符串*/ int strInStrPos(char s1[], char s2[]); /*打印hello的8种方式打印八个hello*/ void printHello(); /*从一个字符串str中子串substr的前面增加一个新字符串newstr*/ void addStringInString(char *newstr, char *substr, char *str); /*从一个字符串str中使用newstr替换一个子串substr*/ void changeStringInString(char *newstr, char *substr, char *str); /*从一个字符串str中删除一个子串substr*/ void deleteStringInString(char *substr, char *str); /**********************************************经典算法**********************************************/ /*河内之塔算法,N为盘子个数,A,B,C分别表示三个柱子,搬运次数*/ void Hanoi(int N, char A, char B, char C); /*费氏数列:1 1 2 3 5 8 13 ...... 有关系F(N) = F(N-1) + F(N-2) 求F(N)*/ int Fib(int N); /*帕斯卡三角形,N为多项式的(a+b)^N中的N,n为系数所处的位置,返回值为系数值,要满足 N >= n*/ int Paska(int N, int n); /*老鼠走迷宫问题: 使用二维阵列表示迷宫 用2表示墙壁,用0表示空白可以行走,用1表示老鼠可以走出的路径 在起始位置有四个方向可以走,上下左右,起始位置肯定空白 */ #define M 10 //数组列数 //int flag = 0; //是否找到标记 /*查看i行j列处是否为空白,返回1表示成功找到,返回0表示没有找到,*/ int visitArray(int startY, int startX, int endY, int endX, int(*P)[M]); /*50个台阶,每次要么走一步,要么走两步,问有多少次走法 1个台阶 1 1 2 11 2 2 3 111 12 21 3 4 1111 22 121 112 211 5 要到达50,从48走2,或从49走1所以有F(N) = F(N-1) + F(N-2) */ int stepF(int n); /*********************************************数据结构算法*********************************************/ /*********************************************文件操作算法*********************************************/ /*从键盘读取字符输出到磁盘文件中,若读取到#,则结束*/ void readFromKey(); /*从磁盘文件读取内容,然后显示在屏幕上*/ void printFileContent(); /*文件复制*/ int copyFile(char *src, char *des); /*将一个长度为L的整形数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/ void writeIntArrayToFile(int a[], int L, char *path, int flag); /*将路径path表示的文件内容读取到整形数组a中,读取长度为L*/ void readFileToIntArray(int a[], int L, char *path); /*将一个长度为L的Double数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/ void writeDoubleArrayToFile(double a[], int L, char *path, int flag); /*将路径path表示的文件内容读取到双精度浮点数组a中,读取长度为L*/ void readFileToDoubleArray(double a[], int L, char *path); /*将首地址为P的大小为L*SIZE的内存块写入到路径path表示的文件中,内存块的组成小块大小为SIZE,个数为L,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/ void writeMemoryToFile(void *addr, int SIZE, int L, char *path, int flag); /*将路径path表示的文件内容读取到首地址为P的大小为L*SIZE的内存块中,读取长度为L,每小块大小为SIZE字节*/ void readFileToMemory(void *addr, int SIZE, int L, char *path); /*在黑窗口查看一个文本文件内容,使用cmd命令,path为文件路径*/ void lookFileUseType(char *path); /*在黑窗口查看一个文本文件内容,使用文件指针,path为文件路径*/ void lookFileUsePointer(char *path); /*测量一个文件长度,查看文件大小,字节数表示,返回-1表示失败*/ long measureFileSize(char *path); /*清空一个文件内容,任何格式磁盘文件文件大小变为0,但是不删除该文件*/ void clearFileContent(char *path); /*将一个长度为L的字符型数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/ void writeCharArrayToFile(char a[], int L, char *path, int flag); /*将路径path表示的文件内容读取到字符型数组a中,读取长度为L*/ void readFileToCharArray(char a[], int L, char *path); /*修改路径为path的文件,将它距离文件开头pos字节数的位置的一个字节二进制数据修改为c*/ void changeFileByte(char *path, int pos, char c); /*修改路径为path的文件,将它距离文件开头pos字节数的位置的L个字节二进制数据修改为*c*/ void changeFileBytes(char *path, int pos, int L, char *c); /*合并两个文件,使用二进制形式,将一个文件rear添加到另一个文件front的末尾,flag=1表示合并后删除read文件,flag=0表示不删除*/ void combineTwoFileBin(char *front, char *rear, int flag); /*根据指定路径创建一个目录*/ void makeDir(char *path); /*统计英文文档大写字母个数,小写字母个数,数字字符数,统计换行符个数,空格字符个数,逗号字符数,其他字符数,按顺序存放在一个长度为7count数组中,path为文件路径 ,L必须为7*/ void statEnglishFile(char *path, int count[], int L); /*统计双字节字符*/ int statFileDoubleChar(char *path); /*统计汉字字符,汉字采用GBK编码*/ int statFileChineseChar(char *path); /*windows下在路径searchpath下搜索文件名前缀为frontname后缀为rearname的文件,如果两者有一个为*代表通配符,统配任何哪种格式的文件,outputfile为存储找到的文件路径信息的文件*/ void searchFileInWindows(char *searchpath, char *frontname, char *rearname, char *outputfile); /*linux下在路径searchpath下搜索文件名前缀为frontname后缀为rearname的文件,如果两者有一个为*代表通配符,统配任何哪种格式的文件,outputfile为存储找到的文件路径信息的文件*/ void searchFileInLinux(char *searchpath, char *frontname, char *rearname, char *outputfile); /***************文件加密*****************/ /*移位加密文本文件path为文件路径,endpath为加密后的密文路径,key为秘钥*/ void encryptedFileUseMoveBit(char *path, char *endpath, int key); /*移位解密文本文件path为文件路径,endpath为解密后的明文路径,key为秘钥*/ void decryptedFileUseMoveBit(char *path, char *endpath, int key); /*异或加密文件path为文件路径,endpath为加密后的密文路径,key为秘钥*/ void encryptedFileUseXor(char *path, char *endpath, int key); /*异或解密文件path为文件路径,endpath为解密后的明文路径,key为秘钥*/ void decryptedFileUseXor(char *path, char *endpath, int key); /*字符串加密文件path为文件路径,endpath为加密后的密文路径,key为秘钥,L为长度*/ void encryptedFileUseChars(char *path, char *endpath, char key[], int L); /*字符串解密文件path为文件路径,endpath为解密后的明文路径,key为秘钥,L为长度*/ void decryptedFileUseChars(char *path, char *endpath, char key[], int L); /*文件分割,path为要分割的文件路径name为文件名,count为分割数量,savepath为保存路径,返回-1表示分割失败,0表示成功*/ int splitFile(char *path, int count, char *savepath, char *savename); /*合并文件,将文件list中每一行指定的文件按行顺序合并为一个大文件bigfile返回-1表示分割失败,0表示成功*/ int mergeFile(char *list, int count, char *bigfile); /*写入一行文本到文件将一行字符串str写入文件path中,使用系统命令,mode表示模式,非0表示追加模式,0表示重新从头写入*/ void writeStringToFile(char *str, char *path, int mode); /*写入一行文本到文件将一行字符串str写入文件path中,使用文件指针,mode表示模式,非0表示追加模式,0表示重新从头写入*/ void writeStringToFileUsePointer(char *str, char *path, int mode); /*打印path这个文本文件内容*/ void printfFileContent(char *path); /*文本文件查询,在文件path中搜索字符串str,如果找到返回1,没找到返回0,找到后将所在行号和内容打印出来*/ int searchStringInFile(char *substr, char *path); /*文本文件删除,在文件path中删除字符串substr,temp为临时文件,如果成功返回1,没成功返回0,将删除后的文件打印出来*/ int deleteStringFromFile(char *substr, char *path, char *temp); /*文本文件修改,在文件path中使用newstr替换字符串substr,temp为临时文件,如果成功返回1,没成功返回0,*/ int changeStringInFile(char *newstr, char *substr, char *path, char *temp); /*文本文件增加,在文件path中将newstr添加在字符串substr的前面,temp为临时文件,如果成功返回1,没成功返回0,*/ int addStringToFile(char *newstr, char *substr, char *path, char *temp); /*在文件path中搜索字符串str所在行然后打印出来*/ void printStringInLine(char *substr, char *path); /*在文件path中读取第n行然后打印出来,*/ void printnLineString(int n, char *path); /*******************************************************内存操作算法***********************************/ /*内存检索原理,检索int类型整数num,并用newnum进行替换的算法,startadd为起始地址十六进制表示形式,endadd为终止地址十六进制表示形式,返回0表示找到,返回-1表示未找到*/ int searchIntInMemory(int startadd, int endadd, int num, int newnum);
2.这是自己实现的算法库源文件
#define _CRT_SECURE_NO_WARNINGS #include "algorithm.h" /*本算法库封装了大多数常用算法,经过测试,可以直接使用,使用请尊重作者的成果,注明出处*/ /*******************************************************内存操作算法***********************************/ /*内存检索原理,检索int类型整数num,并用newnum进行替换的算法,startadd为起始地址十六进制表示形式,endadd为终止地址十六进制表示形式,返回0表示找到,返回-1表示未找到*/ int searchIntInMemory(int startadd, int endadd, int num, int newnum) { void * start = (void *)startadd; void * end = (void *)endadd; for (char *p = start; p < end; p++)//一次移动一个字节,遍历地址空间 { int *pnum = (int *)p;//pnum每次从p开始的地址取四个字节 if (*pnum == num) { *pnum = newnum; return 0; } } return -1; } /********************************************排序查询类算法********************************************/ /*二分查找法,上,中,下,前提数组必须有序找到返回0否则返回-1*/ int binerySearch(char **p, int count, char *des) { int low = 0; int high = count; while (low < high) { int mid = (low + count) / 2; if (strcmp(des, p[mid]) < 0) { high = mid - 1; } else if (strcmp(des, p[mid]) > 0) { low = mid + 1; } else { printf("找到了"); return 0; } } return -1; } /********************************************数学类算法********************************************/ /*乘法表打印方形*/ void print9X9Table() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { printf("%d X %d = %d ", i, j, i*j); } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印反对角线以下*/ void print9X9Table1() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i >= j) printf("%d X %d = %d ", i, j, i*j); } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印反对角线以上*/ void print9X9Table2() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i <= j) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印正对角线以上*/ void print9X9Table3() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i + j <= 10) { printf("%d X %d = %d ", i, j, i*j); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印反对角线以下*/ void print9X9Table4() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i + j >= 10) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印反对角线上的*/ void print9X9Table5() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i == j) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印正对角线上的*/ void print9X9Table6() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i + j == 10) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印两条对角线上部的*/ void print9X9TableUp() { printf("上部区域: "); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i < j && (i + j < 10)) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印两条对角线下部的*/ void print9X9TableDown() { printf("下部区域: "); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i > j && (i + j > 10)) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印两条对角线左边的*/ void print9X9TableLeft() { printf("左部区域: "); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i > j && (i + j < 10)) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*乘法表打印两条对角线右边的的*/ void print9X9TableRight() { printf("右部区域: "); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i < j && (i + j > 10)) { printf("%d X %d = %d ", i, j, i*j); } else { printf(" "); } } printf(" "); } printf("————————————————————————————————————"); } /*求2的N次方*/ int T2n(int N) { int i = 1; int num = 1; for (; i <= N; i++) { num *= 2; } return num; } /*求2的一次方到2的N次方的和*/ int S2n(int N) { int i = 1; int num = 0; for (; i <= N; i++) { num += T2n(i); } return num; } /*求两个数的最大公因数 a > b*/ int maxCommonFactor(int a, int b) { int r = 0; while ( b != 0) { r = a % b; a = b; b = r; } return a; } /*求两个数的最小公倍数*/ int minCommonDouble(int a, int b) { int m = maxCommonFactor(a, b); return (a*b) / m; } /*获取N以下的质数,并按从小到大的顺序存放到数组P中,L为存放质数个数地址*/ void getPrimeNumTable(int N,int *P,int *L) { int T = 0; int m = 0; for (int j = 2; j <= N; j++) { T = sqrt(j); int i; for (i = 2; i <= T; i++) { if (j % i == 0 ) { break; } } if (i > T) { P[m++] = j; } if (m > L - 1) return; } *L = m; } /*求一个数的所有质因数,并按从小到大的顺序存放到数组P中,L为存放质因数个数地址,F为中间获取质数的数组表,T为存储质数数组长度的变量*/ int getFactor(int m,int *P,int *F,int *L,int *T) { int n = 0; getPrimeNumTable(m, F, T); for (int i = 0; i < *T; i++) { if (m % F[i] == 0) { P[n++] = F[i]; } } *L= n; return n; } /*使用递归10进制转0进制打印*/ void PrintBin(int n) { if (n == 0) { return; } else { int x = n % 2;//只要将2改为8,或16就可以转换为8进制或16进制 n /= 2; //printf("%d", x);放在递归调用之前,则会先打印,二进制反序 PrintBin(n); printf("%d", x);//放在递归调用之后,则会最后执行打印 } } /*穷举法求13X+12Y=100的整数解,X = (100 - 12Y)/ 13 为整数*/ void getEquationValue() { for (int i = 0;; i++) { if ((100 - 12 * i) % 13 == 0) { printf("整数解为:X = %d,Y = %d ", (100 - 12 * i) / 13, i); break; } } system("pause"); } /*二进制整数转十进制,接受一个二进制字符串,将它转为10进制整数数*/ int BinToDec(char *bin) { char *p; int len = 0;//统计二进制位数 int num = 0; for (p = bin; *p != '