算法描述:
输入数字n,按顺序打印出从0到最大n位十进制数
算法实现:
/*************************************************************************
> File Name: main.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年05月22日 星期日 14时08分00秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "print1ToMax.h"
// ====================测试代码====================
void Test(int n)
{
printf("Test for %d begins:\t", n);
print1ToMax_1(n);
print1ToMax_2(n);
printf("Test for %d ends.\n", n);
}
int main()
{
Test(1);
Test(2);
Test(3);
Test(0);
return 0;
}
/*************************************************************************
> File Name: print1ToMax.h
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年05月22日 星期日 13时52分18秒
************************************************************************/
#ifndef _PRINT1TOMAX_H
#define _PRINT1TOMAX_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* 输入数字n,按顺序打印出从0到最大n位十进制数
* 例如:输入3,输出:1,2,3,。。。99
* */
void print1ToMax_1(int n);
void print1ToMax_2(int n);
#endif
/*************************************************************************
> File Name: print1ToMax.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年05月22日 星期日 13时53分23秒
************************************************************************/
#include "print1ToMax.h"
int InCrement(char *number)
{
int isOver = 0;
int nStart = 0;
int length = strlen(number);
int i;
for (i = length - 1; i>=0; i--)
{
int nSum = number[i] -'0' + nStart;
if (i == length - 1)
{
nSum++;
}
if (nSum >=10)
{
if (i == 0)
{
isOver = 1;
}
else
{
nSum -= 10;
nStart = 1;
number[i] = '0' + nSum;
}
}
else
{
number[i] = '0' + nSum;
break;
}
}
return isOver;
}
void printNumber(char *number)
{
int ret = 1;
int length = strlen(number);
int i = 0;
for (i=0; i<length; i++)
{
if(ret&&number[i]!='0')
{
ret = 0;
}
if (!ret)
{
printf("%c", number[i]);
}
}
printf("\t");
}
void print1ToMax_1(int n)
{
if (n <= 0)
return ;
char *number = (char *)malloc((n+1)*sizeof(char));
memset(number, '0', n);
number[n] = '\0';
while ( !InCrement(number) )
{
printNumber(number);
}
printf("\n");
free(number);
}
void Print1ToMaxRecursively(char *number, int length, int index)
{
if (index == length - 1)
{
printNumber(number);
return ;
}
int i = 0;
for (i = 0; i < 10; i++)
{
number[index+1] = i + '0';
Print1ToMaxRecursively(number, length, index+1);
}
}
void print1ToMax_2(int n)
{
if (n <= 0)
return ;
char *number = (char *)malloc((n+1)*sizeof(char));
number[n] = '\0';
int i = 0;
for (i = 0; i < 10; i++)
{
number[0] = i + '0';
Print1ToMaxRecursively(number, n, 0);
}
free(number);
}
.PHONY:clean all
CC = gcc
CFLAGS = -g -O2 -Wall
BIN = main
all:$(BIN)
%.o:%.c
$(CC) -o $@ -c $(CFLAGS) $<
clean:
rm -rf *.o $(BIN)