1、如果已知一个数的阶乘的结果不大于10的4次方,则可以设置一个矩阵b[4]存放每个位。
例如,5!=120,则,b[0]=0,b[1]=2,b[2]=1,b[3]=0。
给出一个求阶乘的方法:如果已知K的阶乘,求K+1的阶乘时,
可用矩阵b的每一位去乘以(k+1),如果结果大于9,就进位到前一位,直到所有的位都小于等于9
问:(1)、如果是b[100],写出完整的求阶乘的程序
(2)、完善程序,要求判断输入是不是满足要求的
(3)、用几组数据测试程序
看问题目就知道用什么方法了吧:递归,对就是这个。
typedef unsigned char byte; byte bBuffer[100]={0}; void Fun(int nIndex) { if(1==nIndex) bBuffer[99]=1; else { Fun(nIndex-1); byte bFormal=0; byte bTemp=0; for(int i=99;i>=0;--i) { bTemp=bBuffer[i]*nIndex+bFormal; bFormal=0; if(bTemp>9) { bBuffer[i]=bTemp%10; bFormal=bTemp/10; } else bBuffer[i]=bTemp; } } } void ShowBuffer() { for(int i=0;i<10;++i) { for(int j=0;j<10;++j) printf("%d ",bBuffer[i*10+j]); printf("\n\n"); } }
2、已知一个链表的头结点指针pHead,链表共有3n个元素,n>0且n为未知数。
只用一次遍历求链表的第n、2n个元素值并打印出。
//方法一:用一个容器装下所有的元素,并计数
LIST<int>* pHead=g_pHead->pNext; int n=0; vector<int> data; while(pHead) { n++; data.push_back(pHead->data); pHead=pHead->pNext; }
//方法二 前后三个指针,前面的指针前进一步,后面的指针就前进两步 ,最后的那个指针前进三步
LIST<int>* pFront,*pMid,*pTail; pFront=pMid=pTail=g_pHead->pNext; LIST<int>* pValue1=NULL,*pValue2=NULL; while(pTail) { for(int i=0;i<3;++i) //每回只前进三步 pTail=pTail->pNext; pValue1=pFront;//保存前一个指针 pFront=pFront->pNext;//每回只前进一步 pMid=pMid->pNext; pValue2=pMid;//保存前一个指针 pMid=pMid->pNext; }
完整代码见下面:
#include "stdafx.h" #include <iostream> #include <vector> #include <time.h> using std::vector; /*1、如果已知一个数的阶乘的结果不大于10的4次方,则可以设置一个矩阵b[4]存放每个位。 例如,5!=120,则,b[0]=0,b[1]=2,b[2]=1,b[3]=0。 给出一个求阶乘的方法:如果已知K的阶乘,求K+1的阶乘时, 可用矩阵b的每一位去乘以(k+1),如果结果大于9,就进位到前一位,直到所有的位都小于等于9 问:(1)、如果是b[100],写出完整的求阶乘的程序 (2)、完善程序,要求判断输入是不是满足要求的 (3)、用几组数据测试程序*/ typedef unsigned char byte; byte bBuffer[100]={0}; void Fun(int nIndex) { if(1==nIndex) bBuffer[99]=1; else { Fun(nIndex-1); byte bFormal=0; byte bTemp=0; for(int i=99;i>=0;--i) { bTemp=bBuffer[i]*nIndex+bFormal; bFormal=0; if(bTemp>9) { bBuffer[i]=bTemp%10; bFormal=bTemp/10; } else bBuffer[i]=bTemp; } } } void ShowBuffer() { for(int i=0;i<10;++i) { for(int j=0;j<10;++j) printf("%d ",bBuffer[i*10+j]); printf("\n\n"); } } /*已知一个链表的头结点指针pHead,链表共有3n个元素,n>0且n为未知数。 只用一次遍历求链表的第n、2n个元素值并打印出。 */ template<class T> struct LIST { T data;//数据存储区 LIST<T>* pNext;//保存下一个节点的地址 }; LIST<int>* g_pHead=NULL; int g_nCount=0; void CreateList(LIST<int>* pHead) { printf("开始构造链表…………\n"); if(NULL==pHead)//构造头结点 { pHead=new LIST<int>; g_pHead=pHead; pHead->data=0; } while(!g_nCount) g_nCount=(rand()%20)*3; LIST<int>* pTemp=pHead; LIST<int>* pItem=NULL; for(int i=0;i<g_nCount;++i) { pItem=new LIST<int>; pItem->data=rand()%100; pItem->pNext=NULL; pTemp->pNext=pItem; pTemp=pItem; } printf("链表构造完成…………\n"); } void FreeList(LIST<typename>* pHead) { LIST<typename>* pTemp=NULL; while(pHead) { pTemp=pHead; pHead=pHead->pNext; delete pTemp; } } void ShowList(LIST<int>* pHead) { LIST<int>* pTemp=pHead->pNext; int nCount=0; while(pTemp) { nCount++; printf("第%d个元素值是:%d\n",nCount,pTemp->data); pTemp=pTemp->pNext; } printf("当前链表中共有%d个元素,申请的空间数是%d\n",nCount,g_nCount); } int _tmain(int argc, _TCHAR* argv[]) { srand((unsigned int)time(NULL)); // Fun(200); // ShowBuffer(); CreateList(g_pHead); //方法一:用一个容器装下所有的元素,并计数 LIST<int>* pHead=g_pHead->pNext; int n=0; vector<int> data; while(pHead) { n++; data.push_back(pHead->data); pHead=pHead->pNext; } printf("\n======================================================\n方法一:\n"); printf("3n=%d,第%d个数是%d,第%d个数是%d\n",n,n/3,data[n/3-1],n/3*2,data[n/3*2-1]); //方法二 前后三个指针,前面的指针前进一步,后面的指针就前进两步 ,最后的那个指针前进三步 printf("\n======================================================\n方法二:\n"); LIST<int>* pFront,*pMid,*pTail; pFront=pMid=pTail=g_pHead->pNext; LIST<int>* pValue1=NULL,*pValue2=NULL; while(pTail) { for(int i=0;i<3;++i) //每回只前进三步 pTail=pTail->pNext; pValue1=pFront;//保存前一个指针 pFront=pFront->pNext;//每回只前进一步 pMid=pMid->pNext; pValue2=pMid;//保存前一个指针 pMid=pMid->pNext; } printf("第n个元素值是%d,第2n个元素值是%d\n\n",pValue1->data,pValue2->data); ShowList(g_pHead); FreeList(g_pHead); return 0; }
为了测试我们用上面的方法是否正确才用全局变量保存下随机生成的数。