#include <stdio.h>
#include <memory>
void PrintNumber(char* A);
bool Increment(char* A);
// ====================方法一====================
void Print1ToMaxN_1(int n)
{
if (n<= 0)
return;
char *A = new char[n + 1];
memset(A, '0', n);
A[n] = '\0';
while (Increment(A)!=true) //加完1沒有溢出,打印
PrintNumber(A);
delete[]A;
}
// 字符串A表示一個數字,在 A上增加1
// 如果做加法溢出,則返回true;否則爲false
bool Increment(char* A)
{
for (int carry=0, i = strlen(A) - 1; i >= 0; i--)
{
int nSum = A[i] - '0' + carry;
if (i == strlen(A) - 1)
nSum++;
if(nSum<10) //沒加到10, 返回false,表示沒溢出
{
A[i]=nSum+'0';
return false;
}
else if (i == 0) //加到了10:且已經到了最高位,返回true,表示溢出 //沒在最高位上
return true;
else //加到了10,但沒在最高位,故進位操作
{
nSum -= 10;
carry = 1;
A[i] = nSum + '0' ;
}
}
return false;
}
// ====================方法二====================
void Print1ToMaxN_2(char* A, int length, int index)
{
if (index == length)
{
PrintNumber(A);
return;
}
for (int i = 0; i < 10; ++i)
{
A[index] = i + '0';
Print1ToMaxN_2(A, length, index + 1);
}
}
void Print1ToMaxN_2(int n)
{
if (n <= 0)
return;
char* A = new char[n + 1];
memset(A,'0',n);
A[n] = '\0';
Print1ToMaxN_2(A, n, 0);
delete[] A;
}
void PrintNumber(char* A)
{
for(int i=0;A[i] == '0';++i);
for(;i<strlen(A);++i)
printf("%c", A[i]);
printf(" ");
}
void main()
{
while(1)
{
int n;
printf("幾位數:");
scanf("%d",&n);
Print1ToMaxN_1(n);
printf("\n\n\n");
Print1ToMaxN_2(n);
printf("\n");
}
}
劍指offer--面試題17:打印從1到最大的n位數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.