剑指offer:打印1到最大的n位数

来源:互联网 发布:php foreach遍历数组 编辑:程序博客网 时间:2024/05/21 19:29

题目:输入数字n,按顺序打印出从1到n位十进制数,比如输入3,则打印出1、2、3一直到最大的3位数999

要求:

1、实现大整数的输入,例如输入的数超过了int、long的表示范围,应该采用大整数

2、特殊的输入,0、-1


C语言中大整数的的运算,使用字符串来实现的,本题的关键在于,从0开始,没有加1,然后输入对应位的最大数,然后继续加1,知道相加的数等于输入的数n为止。


下面是本程序的源码:

#include<stdio.h>#include<string.h>#define MAX 100char *reverse(char *s);char *add_one(char *s);void print_MaxNum(char *s){    int length=strlen(s);    char result[MAX]={0};    char str[MAX]="0";    printf("\n");    while(strcmp(s,add_one(str))!=0)    {        strcat(result,"9");        printf("%s\t位的最大值为:\t%s\n",str,result);    }    strcat(result,"9");    printf("%s\t位的最大值为:\t%s\n",str,result);}char *add_one(char *s){    char *str=reverse(s);    int length=strlen(str);    int cf=0,i=0,tmp;    while(i<length)    {        if(i==0)tmp=cf+(str[i]-'0')+1;        else tmp=cf+(str[i]-'0');        if(tmp>=10)        {            str[i]=(tmp-10)+'0';            cf=1;        }        else        {            str[i]=tmp+'0';            cf=0;        }        ++i;    }    if(cf==1)str[length]='1';    s=reverse(str);    return s;}char *reverse(char *s){    int length=strlen(s);    int i=0,j=length-1;    char tmp;    while(i<j)    {        tmp=s[i];        s[i]=s[j];        s[j]=tmp;        ++i;        --j;    }    return s;}int main(){    printf("请输入一个数字字符串:\n");    char digit[MAX]={0};    scanf("%s",digit);    if(digit!=NULL)    {        if(digit[0]=='-')        {            printf("\n你输入的字符串(为负)有误!\n");            exit(0);        }        if(digit[0]=='0')        {            printf("\n你输入的字符串(为0)没有最大值!\n");            exit(0);        }    }    //print_MaxNum(digit);    //printf("\n%s\n%s",add_one(digit));    print_MaxNum(digit);    return 0;}

下面是运行结果的截图:





C语言中大整数的运算是比较重要的,至少大家要知道怎么去求,也可以自己写一下代码,练练手。

0 0
原创粉丝点击