`
收藏列表
标题 标签 来源
随机数 c++基础
#include <math.h> 
 
/* variables are declared static so that they cannot conflict 
with names of   */ 
/* other global variables in other files.  See K&R, p 80, for 
scope of static */ 
static double oldrand[55];                      /* Array of 55 
random numbers */ 
static int jrand;                                    /* 
current random number */ 
static double rndx2;                       /* used with random 
normal deviate */ 
static int rndcalcflag;                    /* used with random 
normal deviate */ 
 
advance_random() 
/* Create next batch of 55 random numbers */ 
{ 
    int j1; 
    double new_random; 
 
    for(j1 = 0; j1 < 24; j1++) 
    { 
        new_random = oldrand[j1] - oldrand[j1+31]; 
        if(new_random < 0.0) new_random = new_random + 1.0; 
        oldrand[j1] = new_random; 
    } 
    for(j1 = 24; j1 < 55; j1++) 
    { 
        new_random = oldrand [j1] - oldrand [j1-24]; 
        if(new_random < 0.0) new_random = new_random + 1.0; 
        oldrand[j1] = new_random; 
    } 
} 
 
 
int flip(prob) 
/* Flip a biased coin - true if heads */ 
float prob; 
{ 
    float randomperc(); 
 
    if(randomperc() <= prob) 
        return(1); 
    else 
        return(0); 
} 
 
 
initrandomnormaldeviate() 
/* initialization routine for randomnormaldeviate */ 
{ 
    rndcalcflag = 1; 
} 
 
 
double noise(mu ,sigma) 
/* normal noise with specified mean & std dev: mu & sigma */ 
double mu, sigma; 
{ 
    double randomnormaldeviate(); 
 
    return((randomnormaldeviate()*sigma) + mu); 
} 
 
double randomnormaldeviate() 
/* random normal deviate after ACM algorithm 267 / Box-Muller Method */ 
{ 
    double sqrt(), log(), sin(), cos(); 
    float randomperc();  
    double t, rndx1; 
 
    if(rndcalcflag) 
    { 
        rndx1 = sqrt(- 2.0*log((double) randomperc())); 
        t = 6.2831853072 * (double) randomperc(); 
        rndx2 = sin(t); 
        rndcalcflag = 0; 
        return(rndx1 * cos(t)); 
    } 
    else 
    { 
        rndcalcflag = 1; 
        return(rndx2); 
    } 
} 
 
 
float randomperc() 
/* Fetch a single random number between 0.0 and 1.0 - Subtractive Method */ 
/* See Knuth, D. (1969), v. 2 for details */ 
/* name changed from random() to avoid library conflicts on some machines*/ 
{ 
    jrand++; 
    if(jrand >= 55) 
    { 
        jrand = 1; 
        advance_random(); 
    } 
    return((float) oldrand[jrand]); 
} 
 
 
int rnd(low, high) 
/* Pick a random integer between low and high */ 
int low,high; 
{ 
    int i; 
    float randomperc(); 
 
    if(low >= high) 
        i = low; 
    else 
    { 
        i = (randomperc() * (high - low + 1)) + low; 
        if(i > high) i = high; 
    } 
    return(i); 
} 
 
 
float rndreal(lo ,hi) 
/* real random number between specified limits */ 
float lo, hi; 
{ 
    return((randomperc() * (hi - lo)) + lo); 
} 
 
 
warmup_random(random_seed) 
/* Get random off and running */ 
float random_seed; 
{ 
    int j1, ii; 
    double new_random, prev_random; 
 
    oldrand[54] = random_seed; 
    new_random = 0.000000001; 
    prev_random = random_seed; 
    for(j1 = 1 ; j1 <= 54; j1++) 
    { 
        ii = (21*j1)%54; 
        oldrand[ii] = new_random; 
        new_random = prev_random-new_random; 
        if(new_random<0.0) new_random = new_random + 1.0; 
        prev_random = oldrand[ii]; 
    } 
 
    advance_random(); 
    advance_random(); 
    advance_random(); 
 
    jrand = 0; 
} 
/*-------------------------------------------------------------*/
链表练习 c++基础
#include "stdlib.h"
#include "stdio.h"
#include <iostream>
#include <Windows.h>

#define MaxSize 1000

using namespace std;

typedef struct node
{
    int num;
    node * lchild;
    node * rchild;
};

struct chain
{
    node * p;
    chain * next;
}*head;

typedef struct Stack
{
    int data[MaxSize];
    int top;
};

void postOrder(node *T,Stack s){
    if(T != NULL)
    {
        s.top++;
        s.data[s.top] = T->num;

        if(T->lchild == NULL && T->rchild == NULL){
            for(int i = s.top; i > 0; i--){
                cout << s.data[i];
            }
            cout << endl;
        }

        postOrder(T->lchild,s);
        postOrder(T->rchild,s);

    }
}

//每次新添加的节点加入链表尾部。
void AddNode(int Num){
    node * NewNode = (node*)calloc(1,sizeof (node));
    NewNode->num = Num;
    node * FatherNode = head->p;
    if(FatherNode->lchild == NULL)
        FatherNode->lchild = NewNode;
    else if(FatherNode->rchild == NULL){
        FatherNode->rchild = NewNode;
        //如果右节点也添加了,则链表头移到下一个
        head = head->next ;
    }
    else
        return;
    chain *tail = head;
    //找到链表尾
    while (tail->next != NULL)
        tail = tail->next;
    //添加新节点到链表尾
    chain *Newtail = (chain*)calloc(1,sizeof (chain));
    Newtail->p = NewNode;
    tail->next = Newtail;
}
int main()
{
    //根节点
    int k = 0; // k层
    node * root=(node*)calloc(1,sizeof (node));
    root->num=1;

    head=(chain*)calloc(1,sizeof (chain));
    head->p =root;
    head->next =NULL;

    cout << "请输入N(N个二进制位,取值范围大于等于1):" << endl;
    cin >> k;

    k = pow(2.0,k + 1) - 1;

    for(int N = 2;N <= k;N++){
        int tmp = N % 2;
        AddNode(tmp);
    }
    Stack s;
    s.top = -1;

    postOrder(root,s);

    system("pause");

    return 0;
}
图的邻接表存储结构 c++基础
/************************************************************************/
/* 图的邻接表存储结构                                                    */
/************************************************************************/
#ifdef _MSC_VER
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#endif
#endif

#include <stdio.h>
#define MaxVertexNum 100
#define QueueSize 30 
typedef enum{ FALSE, TRUE }Boolean;
Boolean visited[MaxVertexNum];
typedef char VertexType;
typedef int EdgeType;
typedef struct node     //边表结点
{
    int adjvex;         //邻接点域
    struct node *next;  //域链
    //若是要表示边上的权,则应增加一个数据域
}EdgeNode;
typedef struct vnode    //顶点边结点
{
    VertexType vertex;  //顶点域
    EdgeNode *firstedge;//边表头指针
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum];   //AdjList是邻接表类型
typedef struct
{
    AdjList adjlist;    //邻接表
    int n, e;           //图中当前顶点数和边数
}ALGraph;               //对于简单的应用,无须定义此类型,可直接使用AdjList类型
/************************************************************************/
/* 建立无向图的邻接表算法                                               */
/************************************************************************/
void CreateGraphAL(ALGraph *G)
{
    int i, j, k;
    EdgeNode * s;
    printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
    scanf("%d,%d", &(G->n), &(G->e));       // 读入顶点数和边数   
    printf("请输入顶点信息(输入格式为:顶点号<CR>)每个顶点以回车作为结束:\n");
    for (i = 0; i < G->n; i++)              // 立有n个顶点的顶点表   
    {
        scanf("\n%c", &(G->adjlist[i].vertex)); // 读入顶点信息   
        G->adjlist[i].firstedge = NULL;            // 点的边表头指针设为空   
    }
    printf("请输入边的信息(输入格式为:i,j):\n");
    for (k = 0; k < G->e; k++)      // 建立边表   
    {
        scanf("\n%d,%d", &i, &j); // 读入边<Vi,Vj>的顶点对应序号   
        s = new EdgeNode;         // 生成新边表结点s   
        s->adjvex = j;         // 邻接点序号为j   
        s->next = G->adjlist[i].firstedge; // 将新边表结点s插入到顶点Vi的边表头部   
        G->adjlist[i].firstedge = s;
        s = new EdgeNode;
        s->adjvex = i;
        s->next = G->adjlist[j].firstedge;
        G->adjlist[j].firstedge = s;
    }
}
/************************************************************************/
/* 深度优先遍历                                                         */
/************************************************************************/
void DFS(ALGraph *G, int i)
{
    //以vi为出发点对邻接表表示的图G进行深度优先搜索
    EdgeNode *p;
    printf("visit vertex:%c\n", G->adjlist[i].vertex);  // 访问顶点vi
    visited[i] = TRUE;              //标记vi已访问
    p = G->adjlist[i].firstedge;        //取vi边表的头指针
    while (p)
    {                               //依次搜索vi的邻接点vj,这里j=p->adjvex
        if (!visited[p->adjvex])    //若vi尚未被访问
            DFS(G, p->adjvex);      //则以Vj为出发点向纵深搜索
        p = p->next;                     //找vi的下一邻接点
    }
}
void DFSTraverseM(ALGraph *G)
{
    int i;
    for (i = 0; i < G->n; i++)
        visited[i] = FALSE;
    for (i = 0; i < G->n; i++)
        if (!visited[i])
            DFS(G, i);
}
/************************************************************************/
/* 广度优先遍历                                                         */
/************************************************************************/
typedef struct
{
    int front;
    int rear;
    int count;
    int data[QueueSize];
}CirQueue;
void InitQueue(CirQueue *Q)
{
    Q->front = Q->rear = 0;
    Q->count = 0;
}
int QueueEmpty(CirQueue *Q)
{
    return Q->count == 0;
}
int QueueFull(CirQueue *Q)
{
    return Q->count == QueueSize;
}
void EnQueue(CirQueue *Q, int x)
{
    if (QueueFull(Q))
        printf("Queue overflow");
    else
    {
        Q->count++;
        Q->data[Q->rear] = x;
        Q->rear = (Q->rear + 1) % QueueSize;
    }
}
int DeQueue(CirQueue *Q)
{
    int temp;
    if (QueueEmpty(Q))
    {
        printf("Queue underflow");
        return NULL;
    }
    else
    {
        temp = Q->data[Q->front];
        Q->count--;
        Q->front = (Q->front + 1) % QueueSize;
        return temp;
    }
}
void BFS(ALGraph*G, int k)
{   // 以vk为源点对用邻接表表示的图G进行广度优先搜索
    int i;
    CirQueue Q;             //须将队列定义中DataType改为int
    EdgeNode *p;
    InitQueue(&Q);          //队列初始化
    printf("visit vertex:%c\n", G->adjlist[k].vertex);      //访问源点vk
    visited[k] = TRUE;
    EnQueue(&Q, k);         //vk已访问,将其人队。(实际上是将其序号人队)
    while (!QueueEmpty(&Q))
    {                                   //队非空则执行
        i = DeQueue(&Q);                    //相当于vi出队
        p = G->adjlist[i].firstedge;        //取vi的边表头指针
        while (p)
        {                               //依次搜索vi的邻接点vj(令p->adjvex=j)
            if (!visited[p->adjvex])
            {                           //若vj未访问过
                printf("visit vertex:%c\n", G->adjlist[p->adjvex].vertex);      //访问vj
                visited[p->adjvex] = TRUE;
                EnQueue(&Q, p->adjvex); //访问过的vj人队
            }
            p = p->next;                    //找vi的下一邻接点
        }
    }
}
void BFSTraverseM(ALGraph *G)
{
    int i;
    for (i = 0; i < G->n; i++)
        visited[i] = FALSE;
    for (i = 0; i < G->n; i++)
        if (!visited[i])
            BFS(G, i);
}
/************************************************************************/
/* 打印邻接表                                                     */
/************************************************************************/
void PrintfGraphAL(ALGraph *G)
{
    for (int i = 0; i < G->n; i++)
    {
        printf("vertex:%c", G->adjlist[i].vertex);
        EdgeNode *p = G->adjlist[i].firstedge;
        while (p)
        {
            printf("→:%d", p->adjvex);
            p = p->next;
        }
        printf("\n");
    }
}
/************************************************************************/
/* 删除邻接表                                                     */
/************************************************************************/
void DeleteGraphAL(ALGraph *G)
{
    for (int i = 0; i < G->n; i++)
    {
        EdgeNode *q;
        EdgeNode *p = G->adjlist[i].firstedge;
        while (p)
        {
            q = p;
            p = p->next;
            delete q;
        }
        G->adjlist[i].firstedge = NULL;
    }
}
/************************************************************************/
/* 主函数调用                                                           */
/************************************************************************/
int main()
{
#ifdef _MSC_VER
    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
    _CrtDumpMemoryLeaks();
#endif

    ALGraph G;
    CreateGraphAL(&G);
    printf("深度优先遍历:\n");
    DFSTraverseM(&G);
    printf("广度优先遍历:\n");
    BFSTraverseM(&G);
    printf("邻接表:\n");
    PrintfGraphAL(&G);
    DeleteGraphAL(&G);

    return 0;
}
递归全排序 小算法
public class Order {

	/**
	 * 递归全排序
	 */
	public static void main(String[] args) {

		int[] a={1,2,3};
		pai(a,0,a.length);

	}
	public static void pai(int[] a,int start ,int end){
		if(start ==end){
			for(int i=0;i<end;i++){      //输出语句
				System.out.print(a[i]);
			}
			System.out.println();
		}
		else{
			for(int c=start;c<end;c++){
				
				int b=a[start];
				a[start] =a[c];   //交换位置
				a[c] =b;
				
				pai(a,start+1,end);
				
				b=a[start];      
				a[start] =a[c];  //返回到原来的样子
				a[c] =b;
				
			}						
		}
	}

}
把十进制数转换成n进制的数 小算法
public class Transform {

	/**
	 * 把十进制数转换成n进制的数
	 */
	public static void main(String[] args) {
		change(1348,8);
	}
	public static void change(int x,int n){
		 int a = x%n;
		 x = x/n;
		 if(x>0){
			 change(x,n);
		 }
		 System.out.print(a+"");
	}
 public static String change(int x){  //10进制转换成2进制
         int a ;
         String ss=new String();
         while(x!=0){
        	 a=x%2;
        	 x=x/2;
        	 ss=a+ss;
         }
         return ss;
    }  
public static int TwoToTen(String str){//2进制转换成10进制
		  int ten=0;
		  int length=str.length();
		  for(int i=0;i<length-1;i++){
			  char j=str.charAt(i);
			  if(j=='1') ten=ten+1;
			  ten= ten*2;
		  }
		  if(str.charAt(length-1)=='1') ten+=1;
		 return ten;
	 }

}
奇怪的数字 小算法(蓝桥杯)
public class Ea1 {

	/**
	 * 奇怪的数字0 , 1 , 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,... 
	 */
	public static void main(String[] args) {
		int a=0,b=1,c=1;
		for(int i=3;i<10;i++){
			a=b;    //第一个数
			b=c;    //第二个数
			c=a+b;  //第三个数
		}
		System.out.println(c);
		System.out.println(sum(10));
	}
	public static int sum(int i){
		return (i==2 ||i==3)?1:sum(i-1)+sum(i-2);
	}
/*
 * 其实用递归是最简单的。
 */
}
5个猴子分苹果 小算法(蓝桥杯)
/**
 * 5个猴子分苹果
 */
public class Apple {
	public static void main(String[] args) {
		System.out.println(sum(5));//sum是总数
	}
	public static int sum(int monkey){		
		return monkey==1?6:5*sum(monkey-1)+1;
	} 
/*主要在设置出口,入口和循环体。容易在出口和入口出错。但是循环体是主要的思路(在大体上把握)
 * 开始点和结束点要把握好。即使变成最小的问题时再解决。
 */
}
奇怪的节目 小算法(蓝桥杯)
public class JieMu {

	/**
	 * 奇怪的节目
	 */
	public static void main(String[] args) {
		int[] a = new int[10];
		sum(0,a,10);

	}
	public static void sum(int i,int[] a,int total){
		if(i == 10){           //输出语句
			if(total == 100){
				for(int j=0;j<a.length;j++){
					System.out.print(a[j]);
				}
				System.out.println();
			}
		}else{
		a[i]=1;
		sum(i+1,a,total*2);
		a[i] = 0;
		sum(i+1,a,total-i-1);}
	}
	/*
	 * 深刻总结
	 */
}
abcd字符串字符的全排序 小算法
/**
 * abcd字符串字符的全排序
 * 递归 
 */
public class Menu1 {
	public static void getOne(int[] arr, int start,int end){
		if(start==end){
			for(int j=0;j<end;j++){  // 如果start==end说明已经排序结束了,输出
				System.out.print(arr[j]);  
			}
			System.out.print("\n");
		}else{
			for(int i=start;i<end;i++){
				int temp=arr[start];  //
				arr[start]=arr[i];  //
				arr[i]=temp;       //
				
				getOne(arr, start+1,end);//将剩下的所有元素全排序;
				temp=arr[start];
				arr[start]=arr[i];
				arr[i]=temp;
			}
		}		
	}
	public static void main(String[] args) {
		int[] arr={1,2,3};
		getOne(arr,0,3);
	}
}
模式匹配 小算法
public class Match {

	/**
	 * 模式匹配
	 */
	public static void main(String[] args) {
		String main = "12345amnbvcxzqwer"; //主串
		String chong ="mnb";          //丛串
		int i=0,j=0;
		while(i<main.length() && j< chong.length()){
			char ma =main.charAt(i);
			char ch =chong.charAt(j);
			if(ma ==ch){
				i++;
				j++;
			}
			else{
				i = i-j+1;  //要比较i的下一个位置,i和j都是从第一个0个位置
				j=0;       //c++是从第二个位置开始的所以要加2
			}
		}
		if(j == chong.length()){
			System.out.println(i-j);
		}else{
			System.out.println("不存在");
		}
		

	}

}
最大公约数和最小公倍数 最大公约数和最小公倍数
public static  int deff(int x, int y) { //求连个数的最大公约数 ,非递归求法
		int t;
		if(x < y) {  //得到x>y
			t = x;
			x = y;  
			y = t;
		 }
		 while(y != 0) {
			if(x == y) return x;
			else {
			int k = x % y;
			 x = y;
			 y = k;
			}
		}
		 return x;
	}
public static int  getBa(int x,int y){  //求最小公倍数
	return (x*y)/deff(x,y);
}
private long gcd(long a, long b){
		if(b==0) return a;
		return gcd(b,a%b);    //利用递归求最大公约数
}
	最大公约数和最小公倍数
全排列 全排列
int[] a={1,2,3};
pai(a,0,a.length); //对数组a中的数全排列,使用的递归排序法

public static void pai(int[] a,int start ,int end){
	if(start ==end){
		for(int i=0;i<end;i++){      //输出语句
			System.out.print(a[i]);
		}
		System.out.println();
	}
	else{
		for(int c=start;c<end;c++){
			
			int b=a[start];
			a[start] =a[c];   //交换位置
			a[c] =b;
			
			pai(a,start+1,end);
			
			b=a[start];      
			a[start] =a[c];  //返回到原来的样子
			a[c] =b;
			
		}						
	}
}
求完数 求完数
System.out.println("1到1000的完数有: ");
	for(int i=1; i<1000; i++) {
		int t = 0;
		for(int j=1; j<= i/2; j++) {
			if(i % j == 0) {
				t = t + j;
			}
		}
		if(t == i) {
			System.out.print(i + " ");
		}
	}
判断素数 判断素数
Scanner c = new Scanner(System.in);
int d= c.nextInt();
for(int i=2;i*i<=d;i++){ //使用i的平方大大降低了时间复杂度
	if(d%i==0){
		flg= false;
		System.out.println("是素数");
		break;
	}
}	
if(flg==true)
	System.out.println("不是素数");
进制转化 进制转化
private static int getRealValue(char c){  //把对应的十六进制单个字符转化10进制数
	if(c>='0'&&c<='9')
		return c-'0';
	if(c>='a'&&c<='f')
		return c-'a'+10;
	if(c>='A'&&c<='F'){
		return c-'A'+10;
	}
	return 0;
}
	public static String jin_zhi_16_3(String str){
		int n=0;
		for(int i=0;i<str.length();i++){
			//n =16*n +getRealValue(str.charAt(i));   //根据16进制转化到10进制的算法
			n  = n + (int)Math.pow(16, str.length()-i-1)*getRealValue(str.charAt(i));
			//下面是一种常规思想(需要调用java中Math方法)但是效率比较低,上面的不太好想
		}    //首先要了解进制的转化规律16*n经典写法
		String t = "";   
	   	   for(;;)   {  
		        if(n==0) break;  
		           t = (n % 3) + t;  //转化进制几就除以几    
		            n = n/3;  // 填空  
		           }     
		   return t;  
	}
大数求余 大数求余
private void input(){
	Scanner c= new Scanner(System.in);
	String str = c.nextLine();
	int[] array = new int[str.length()];
	for(int i=0;i<array.length;i++){ //把所输入的大数存放到数组中,然后求余
		array[i] = Integer.parseInt(str.substring(i, i+1));
	}
	int d = c.nextInt();
	getYushu(array,d);
}
private static void getYushu(int[] array,int d){
	int digit=0;  
	for(int i=0;i<array.length;i++){
		digit = (digit*10+array[i])%d;//这是按照正常的数学思想求余数
	}
	System.out.println(digit);
}
本地变量
public class ProjectContext {

	/**
	 * 线程本地变量
	 */
	private static final ThreadLocal<String> threadlocal = new ThreadLocal<String>();
	
	/**
	 * 设置工程名字
	 */
	public static void setProjectName(String name){
		threadlocal.set(name);
	} 
	
	/**
	 * 获取工程名字
	 * @return
	 */
	public static String getProjectName(){
		return threadlocal.get();
	}
	
	/**
	 * 删除线程本地工程名
	 */
	public static void rmProjectName(){
		threadlocal.remove();
	}
	
	
}
Global site tag (gtag.js) - Google Analytics