您的位置:首页 > 职场人生

剑指Offer----面试题12:打印1到最大的n位数

2016-06-03 16:26 597 查看

题目:

输入数字n,按顺序打印出从1到最大的n为十进制数。比如输入3,打印1、2、3一直到最大的3位数即999.

方法一:

分析:只需计算出最大的数字,然后循环依次打印即可!

源代码如下:

#include<iostream>

using std::endl;
using std::cout;

void PrintOneToMax1(int n)
{
if (n <= 0)
return;

int max = 1;
while (n--)
{
max *= 10;
}

for (int i = 1; i < max; i++)
cout << i << "  ";
cout << endl;
}

int main()
{
PrintOneToMax1(2);

system("pause");
return 0;
}


输出结果:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  2
3  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  4
3  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  6
3  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  8
3  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99
请按任意键继续. . .


缺点:没有考虑到大数问题!

方法二:

分析:考虑到大数问题,我们无论使用int型变量还是用long long类型变量,都可能存在溢出的问题,其中的一种解决方法就是用字符数组模拟数字存储方式,按照需求分配内存空间既不会浪费空间,也不会存在溢出的现象!但问题是怎样模拟数字的加法!!!

源代码如下:
#include<cstdlib>
#include<cstring>
#include<cstdio>

void  PrintOneToMax2(int n);//总体规划函数
bool Increment(char *number);//字符串表达的数字模拟加法
void printNum(char *number);//按照习惯方式打印字符串数字

void PrintOneToMax2(int n)
{
if (n <= 0)
{
puts("Can't print!!!");
return;
}
char *number = (char *)malloc(sizeof(char)*(n + 1));
memset(number, '0', n);
number
= '\0';

while (!Increment(number))
printNum(number);

free(number);
}

bool Increment(char *number)
{
int len = strlen(number);
bool isOverflow = false;
int TakeOver = 0;

for (int i = len - 1; i >= 0; i--)
{
int nSum = number[i] - '0' + TakeOver;
if (i == strlen(number) - 1)
nSum++;

if (nSum >= 10)
{
if (i == 0)
isOverflow = true;
else
{
nSum -= 10;
TakeOver = 1;
number[i] = '0' + nSum;
}
}
else
{
number[i] = '0' + nSum;
break;
}
}

return isOverflow;
}

void printNum(char *number)
{
int len = strlen(number);
bool isPrint = true;
for (int i = 0; i < len; i++)
{
if (isPrint && number[i] != '0')
isPrint = false;

if (!isPrint)
printf("%c", number[i]);
}

printf("  ");
}

int main()
{
PrintOneToMax2(0);
putchar('\n');
PrintOneToMax2(-2);
putchar('\n');
PrintOneToMax2(2);
putchar('\n');

system("pause");
return 0;
}


运行结果:
Can't print!!!

Can't print!!!

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23
24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  4
4  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64
65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  8
5  86  87  88  89  90  91  92  93  94  95  96  97  98  99
请按任意键继续. . .


注意:1.在打印时需要多加注意,用人们习惯的方式来打印数字;2.被忘了delete掉开辟的空间,以防止内存泄漏

方法三:

将问题转化为数字的全排列,n位所有十进制数其实就是n从0到9的全排列,全排列问题用递归算法较容易实现!

源代码如下:

#include<cstdlib>
#include<cstdio>
#include<cstring>

void printNum3(char *number)
{
int len = strlen(number);
bool isPrint = true;
for (int i = 0; i < len; i++)
{
if (isPrint && number[i] != '0')
isPrint = false;

if (!isPrint)
printf("%c", number[i]);
}

printf("  ");
}

void PrintOneToMaxRecu(char *number, int length, int index)
{
if (index == length)
{
printNum3(number);
return;
}

for (int i = 0; i < 10; i++)
{
number[index] = i + '0';
PrintOneToMaxRecu(number, length, index+1);

}
}

void PrintOneToMax3(int n)
{
if (n <= 0)
{
puts("Can't print");
return;
}

char *number = new char[n + 1];
number
= '\0';

PrintOneToMaxRecu(number, n, 0);

delete[] number;
}

int main()
{
PrintOneToMax3(0);
putchar('\n');
PrintOneToMax3(-2);
putchar('\n');
PrintOneToMax3(2);
putchar('\n');

system("pause");
return 0;
}


运行结果和方法二一致!

官方源代码:

#include<cstdio>
#include<cstdlib>
#include <memory>

void PrintNumber(char* number);
bool Increment(char* number);
void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);

// ====================方法一====================
void Print1ToMaxOfNDigits_1(int n)
{
if (n <= 0)
return;

char *number = new char[n + 1];
memset(number, '0', n);
number
= '\0';

while (!Increment(number))
{
PrintNumber(number);
}

delete[]number;
}

// 字符串number表示一个数字,在 number上增加1
// 如果做加法溢出,则返回true;否则为false
bool Increment(char* number)
{
bool isOverflow = false;
int nTakeOver = 0;
int nLength = strlen(number);

for (int i = nLength - 1; i >= 0; i--)
{
int nSum = number[i] - '0' + nTakeOver;
if (i == nLength - 1)
nSum++;

if (nSum >= 10)
{
if (i == 0)
isOverflow = true;
else
{
nSum -= 10;
nTakeOver = 1;
number[i] = '0' + nSum;
}
}
else
{
number[i] = '0' + nSum;
break;
}
}

return isOverflow;
}

// ====================方法二====================
void Print1ToMaxOfNDigits_2(int n)
{
if (n <= 0)
return;

char* number = new char[n + 1];
number
= '\0';

for (int i = 0; i < 10; ++i)
{
number[0] = i + '0';
Print1ToMaxOfNDigitsRecursively(number, n, 0);
}

delete[] number;
}

void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index)
{
if (index == length - 1)
{
PrintNumber(number);
return;
}

for (int i = 0; i < 10; ++i)
{
number[index + 1] = i + '0';
Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
}
}

// ====================公共函数====================
// 字符串number表示一个数字,数字有若干个0开头
// 打印出这个数字,并忽略开头的0
void PrintNumber(char* number)
{
bool isBeginning0 = true;
int nLength = strlen(number);

for (int i = 0; i < nLength; ++i)
{
if (isBeginning0 && number[i] != '0')
isBeginning0 = false;

if (!isBeginning0)
{
printf("%c", number[i]);
}
}

printf("\t");
}

// ====================测试代码====================
void Test(int n)
{
printf("Test for %d begins:\n", n);

Print1ToMaxOfNDigits_1(n);
Print1ToMaxOfNDigits_2(n);

printf("Test for %d ends.\n", n);
}

int main()
{
Test(1);
Test(2);
Test(3);
Test(0);
Test(-1);

system("pause");
return 0;
}


运行结果:
Test for 1 begins:
1       2       3       4       5       6       7       8       9
1       2       3       4       5       6       7       8       9       Test for
1 ends.
Test for 2 begins:
1       2       3       4       5       6       7       8       9       10
11      12      13      14      15      16      17      18      19      20
21      22      23      24      25      26      27      28      29      30
31      32      33      34      35      36      37      38      39      40
41      42      43      44      45      46      47      48      49      50
51      52      53      54      55      56      57      58      59      60
61      62      63      64      65      66      67      68      69      70
71      72      73      74      75      76      77      78      79      80
81      82      83      84      85      86      87      88      89      90
91      92      93      94      95      96      97      98      99
1       2       3       4       5       6       7       8       9       10
11      12      13      14      15      16      17      18      19      20
21      22      23      24      25      26      27      28      29      30
31      32      33      34      35      36      37      38      39      40
41      42      43      44      45      46      47      48      49      50
51      52      53      54      55      56      57      58      59      60
61      62      63      64      65      66      67      68      69      70
71      72      73      74      75      76      77      78      79      80
81      82      83      84      85      86      87      88      89      90
91      92      93      94      95      96      97      98      99      Test for
2 ends.
Test for 3 begins:
1       2       3       4       5       6       7       8       9       10
11      12      13      14      15      16      17      18      19      20
21      22      23      24      25      26      27      28      29      30
31      32      33      34      35      36      37      38      39      40
41      42      43      44      45      46      47      48      49      50
51      52      53      54      55      56      57      58      59      60
61      62      63      64      65      66      67      68      69      70
71      72      73      74      75      76      77      78      79      80
81      82      83      84      85      86      87      88      89      90
91      92      93      94      95      96      97      98      99      100
101     102     103     104     105     106     107     108     109     110
111     112     113     114     115     116     117     118     119     120
121     122     123     124     125     126     127     128     129     130
131     132     133     134     135     136     137     138     139     140
141     142     143     144     145     146     147     148     149     150
151     152     153     154     155     156     157     158     159     160
161     162     163     164     165     166     167     168     169     170
171     172     173     174     175     176     177     178     179     180
181     182     183     184     185     186     187     188     189     190
191     192     193     194     195     196     197     198     199     200
201     202     203     204     205     206     207     208     209     210
211     212     213     214     215     216     217     218     219     220
221     222     223     224     225     226     227     228     229     230
231     232     233     234     235     236     237     238     239     240
241     242     243     244     245     246     247     248     249     250
251     252     253     254     255     256     257     258     259     260
261     262     263     264     265     266     267     268     269     270
271     272     273     274     275     276     277     278     279     280
281     282     283     284     285     286     287     288     289     290
291     292     293     294     295     296     297     298     299     300
301     302     303     304     305     306     307     308     309     310
311     312     313     314     315     316     317     318     319     320
321     322     323     324     325     326     327     328     329     330
331     332     333     334     335     336     337     338     339     340
341     342     343     344     345     346     347     348     349     350
351     352     353     354     355     356     357     358     359     360
361     362     363     364     365     366     367     368     369     370
371     372     373     374     375     376     377     378     379     380
381     382     383     384     385     386     387     388     389     390
391     392     393     394     395     396     397     398     399     400
401     402     403     404     405     406     407     408     409     410
411     412     413     414     415     416     417     418     419     420
421     422     423     424     425     426     427     428     429     430
431     432     433     434     435     436     437     438     439     440
441     442     443     444     445     446     447     448     449     450
451     452     453     454     455     456     457     458     459     460
461     462     463     464     465     466     467     468     469     470
471     472     473     474     475     476     477     478     479     480
481     482     483     484     485     486     487     488     489     490
491     492     493     494     495     496     497     498     499     500
501     502     503     504     505     506     507     508     509     510
511     512     513     514     515     516     517     518     519     520
521     522     523     524     525     526     527     528     529     530
531     532     533     534     535     536     537     538     539     540
541     542     543     544     545     546     547     548     549     550
551     552     553     554     555     556     557     558     559     560
561     562     563     564     565     566     567     568     569     570
571     572     573     574     575     576     577     578     579     580
581     582     583     584     585     586     587     588     589     590
591     592     593     594     595     596     597     598     599     600
601     602     603     604     605     606     607     608     609     610
611     612     613     614     615     616     617     618     619     620
621     622     623     624     625     626     627     628     629     630
631     632     633     634     635     636     637     638     639     640
641     642     643     644     645     646     647     648     649     650
651     652     653     654     655     656     657     658     659     660
661     662     663     664     665     666     667     668     669     670
671     672     673     674     675     676     677     678     679     680
681     682     683     684     685     686     687     688     689     690
691     692     693     694     695     696     697     698     699     700
701     702     703     704     705     706     707     708     709     710
711     712     713     714     715     716     717     718     719     720
721     722     723     724     725     726     727     728     729     730
731     732     733     734     735     736     737     738     739     740
741     742     743     744     745     746     747     748     749     750
751     752     753     754     755     756     757     758     759     760
761     762     763     764     765     766     767     768     769     770
771     772     773     774     775     776     777     778     779     780
781     782     783     784     785     786     787     788     789     790
791     792     793     794     795     796     797     798     799     800
801     802     803     804     805     806     807     808     809     810
811     812     813     814     815     816     817     818     819     820
821     822     823     824     825     826     827     828     829     830
831     832     833     834     835     836     837     838     839     840
841     842     843     844     845     846     847     848     849     850
851     852     853     854     855     856     857     858     859     860
861     862     863     864     865     866     867     868     869     870
871     872     873     874     875     876     877     878     879     880
881     882     883     884     885     886     887     888     889     890
891     892     893     894     895     896     897     898     899     900
901     902     903     904     905     906     907     908     909     910
911     912     913     914     915     916     917     918     919     920
921     922     923     924     925     926     927     928     929     930
931     932     933     934     935     936     937     938     939     940
941     942     943     944     945     946     947     948     949     950
951     952     953     954     955     956     957     958     959     960
961     962     963     964     965     966     967     968     969     970
971     972     973     974     975     976     977     978     979     980
981     982     983     984     985     986     987     988     989     990
991     992     993     994     995     996     997     998     999
1       2       3       4       5       6       7       8       9       10
11      12      13      14      15      16      17      18      19      20
21      22      23      24      25      26      27      28      29      30
31      32      33      34      35      36      37      38      39      40
41      42      43      44      45      46      47      48      49      50
51      52      53      54      55      56      57      58      59      60
61      62      63      64      65      66      67      68      69      70
71      72      73      74      75      76      77      78      79      80
81      82      83      84      85      86      87      88      89      90
91      92      93      94      95      96      97      98      99      100
101     102     103     104     105     106     107     108     109     110
111     112     113     114     115     116     117     118     119     120
121     122     123     124     125     126     127     128     129     130
131     132     133     134     135     136     137     138     139     140
141     142     143     144     145     146     147     148     149     150
151     152     153     154     155     156     157     158     159     160
161     162     163     164     165     166     167     168     169     170
171     172     173     174     175     176     177     178     179     180
181     182     183     184     185     186     187     188     189     190
191     192     193     194     195     196     197     198     199     200
201     202     203     204     205     206     207     208     209     210
211     212     213     214     215     216     217     218     219     220
221     222     223     224     225     226     227     228     229     230
231     232     233     234     235     236     237     238     239     240
241     242     243     244     245     246     247     248     249     250
251     252     253     254     255     256     257     258     259     260
261     262     263     264     265     266     267     268     269     270
271     272     273     274     275     276     277     278     279     280
281     282     283     284     285     286     287     288     289     290
291     292     293     294     295     296     297     298     299     300
301     302     303     304     305     306     307     308     309     310
311     312     313     314     315     316     317     318     319     320
321     322     323     324     325     326     327     328     329     330
331     332     333     334     335     336     337     338     339     340
341     342     343     344     345     346     347     348     349     350
351     352     353     354     355     356     357     358     359     360
361     362     363     364     365     366     367     368     369     370
371     372     373     374     375     376     377     378     379     380
381     382     383     384     385     386     387     388     389     390
391     392     393     394     395     396     397     398     399     400
401     402     403     404     405     406     407     408     409     410
411     412     413     414     415     416     417     418     419     420
421     422     423     424     425     426     427     428     429     430
431     432     433     434     435     436     437     438     439     440
441     442     443     444     445     446     447     448     449     450
451     452     453     454     455     456     457     458     459     460
461     462     463     464     465     466     467     468     469     470
471     472     473     474     475     476     477     478     479     480
481     482     483     484     485     486     487     488     489     490
491     492     493     494     495     496     497     498     499     500
501     502     503     504     505     506     507     508     509     510
511     512     513     514     515     516     517     518     519     520
521     522     523     524     525     526     527     528     529     530
531     532     533     534     535     536     537     538     539     540
541     542     543     544     545     546     547     548     549     550
551     552     553     554     555     556     557     558     559     560
561     562     563     564     565     566     567     568     569     570
571     572     573     574     575     576     577     578     579     580
581     582     583     584     585     586     587     588     589     590
591     592     593     594     595     596     597     598     599     600
601     602     603     604     605     606     607     608     609     610
611     612     613     614     615     616     617     618     619     620
621     622     623     624     625     626     627     628     629     630
631     632     633     634     635     636     637     638     639     640
641     642     643     644     645     646     647     648     649     650
651     652     653     654     655     656     657     658     659     660
661     662     663     664     665     666     667     668     669     670
671     672     673     674     675     676     677     678     679     680
681     682     683     684     685     686     687     688     689     690
691     692     693     694     695     696     697     698     699     700
701     702     703     704     705     706     707     708     709     710
711     712     713     714     715     716     717     718     719     720
721     722     723     724     725     726     727     728     729     730
731     732     733     734     735     736     737     738     739     740
741     742     743     744     745     746     747     748     749     750
751     752     753     754     755     756     757     758     759     760
761     762     763     764     765     766     767     768     769     770
771     772     773     774     775     776     777     778     779     780
781     782     783     784     785     786     787     788     789     790
791     792     793     794     795     796     797     798     799     800
801     802     803     804     805     806     807     808     809     810
811     812     813     814     815     816     817     818     819     820
821     822     823     824     825     826     827     828     829     830
831     832     833     834     835     836     837     838     839     840
841     842     843     844     845     846     847     848     849     850
851     852     853     854     855     856     857     858     859     860
861     862     863     864     865     866     867     868     869     870
871     872     873     874     875     876     877     878     879     880
881     882     883     884     885     886     887     888     889     890
891     892     893     894     895     896     897     898     899     900
901     902     903     904     905     906     907     908     909     910
911     912     913     914     915     916     917     918     919     920
921     922     923     924     925     926     927     928     929     930
931     932     933     934     935     936     937     938     939     940
941     942     943     944     945     946     947     948     949     950
951     952     953     954     955     956     957     958     959     960
961     962     963     964     965     966     967     968     969     970
971     972     973     974     975     976     977     978     979     980
981     982     983     984     985     986     987     988     989     990
991     992     993     994     995     996     997     998     999     Test for
3 ends.
Test for 0 begins:
Test for 0 ends.
Test for -1 begins:
Test for -1 ends.
请按任意键继续. . .


注意:

如果面试时关于n位的整数并且没有设定n的取值范围,或者输入任意大小的整数,那么这个题目很可能是需要考虑大数问题的。字符串是一个简单、有效的表示大数的方法!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 剑指offer 面试题