输出数字的位数是没有限制的,所以直接使用int型数字来表示是不可行的,所以可以使用一个整形数组来表示整数,数组的一位表示数字的一位,这样就可以避免整形数字的大小限制。
使用数组来表示的话只要考虑最低位+1后是否会产生进位,如果进位则依次对数组后面的数字进行处理,判断是否继续进位。
程序如下:
/*************************************************************************
> File Name: print1ton.c
> Author: Qiang
> Mail: ilsinging@126.com
> Created Time: 2014年04月23日 星期三 14时47分07秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
void printArray(int *a, int n) //输出数组的前n位
{
int i = 0;
for(i=n; i>=0; i--)
printf("%d", a[i]);
printf("\n");
}
void print1ToN(int n)
{
int* a = NULL;
a = (int*)malloc(sizeof(int) * (n + 1));//开辟n+1位空间,多出的一位用于标志输出结束;
memset(a, 0, sizeof(int) * n);
if(a == NULL)
return 1;
int flag = 0;//flag表示是否有进位
int i = 0, count = 0;//count表示数组现在有多少位
while(1)
{
flag = 0;
count = 0;
a[0]++;
if(a[0] == 10)//最低位自加,到10说明有进位
{
flag = 1;
a[0] = 0;
}
if(flag != 0)//最低位发生进位,循环处理数组后面的位
for(i=1; i<=n; i++)
{
if(flag == 1)
{
a[i]++;
flag = 0;
}
if(a[i] == 10)//继续进位,继续处理
{
a[i] = 0;
flag = 1;
continue;
}
else//没进位,此循环结束
break;
}
if(a[n] == 1)//判断最高位是否为1,为1结束,否则,输出
break;
for(i=n; i>=0; i--)//找出现在应输出的位数
{
if(a[i] != 0)
{
count = i;
break;
}
}
printArray(a, count);//调用输出函数
}
free(a);
a = NULL;
}
int main()
{
int n;
printf("Please input bits of number:");
scanf("%d", &n);
if(n < 0)//错误输入处理
{
printf("Please input number that is bigger than 0!!\n");
return 1;
}
print1ToN(n);
return 0;
}