您的位置:首页 > 编程语言 > C语言/C++

打印1到最大的n位数(C语言)

2018-01-08 23:56 337 查看

打印1到最大的n位数(C语言)

思想+程序

阅读之前注意:

本文阅读建议用时:20min

本文阅读结构如下表:

项目下属项目测试用例数量
思想+程序1

思想+程序

思想:

用字符串来表示大数,并实现加法

打印的时候注意符合阅读习惯(本程序未实现该功能)

程序参考以下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int check(char *str)//检查是否全为9
{
int i = 0;
int len = strlen(str);
for (i = 0; i < len; i++)
if (str[i] != '9')
return 1;
return 0;
}

void count(char *str, int n)//模拟进位机制
{
if (str
!= '9')
{
str
++;
return;
}
else
{
if (n == 0)
return;
str
= '0';
count(str, n - 1);
}

}

void printNum(int n)
{
printf("n:%d\n", n);
int i = 0;
int m = n - 1;
char *str = (int *)malloc((n + 1)*sizeof(char));
for (i = 0; i < n; i++)
str[i] = '0';
str
= '\0';
while (check(str))//检查是否全为9
{
for (i = 0; i < 10; i++)
{
if (str[m] != '9')
{
str[m]++;
printf("%s\n", str);
}
else if (check(str))//检查
{
str[m] = '0';
count(str, m - 1);
printf("%s\n", str);
}
}
}
}

void main()
{
int n;
scanf_s("%d", &n);
printNum(n);
system("pause");
}


以上程序并不简洁,改进算法将在以后添加1

改进算法思路:采用排列组合的思想,可以遍历数的各种情况,第一个位置可以是0-9,第二个位置也是0-9… …如此递归。以排列组合来取代上面程序的模拟进位机制。

参考以下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void count(char *str, int m)
{
int len = strlen(str);
int i = 0;
for (i = 0, str[m] = '0'; i < 10; i++)//当前位置实现0-9
{
if (m == len - 1)//如果是个位上的数值变化就打印
printf("%s\n", str);
if (m < len - 1)//如果当前位置不是个位
count(str, m + 1);//下一个位置实现0-9
str[m]++;
}
}

void printNumber(int n)
{
int i = 0;
char *str = (char *)malloc((n + 1)*sizeof(char));
for (i = 0; i < n; i++)
str[i] = '0';//初始化字符串
str
= '\0';//字符串末尾是'\0'作为结束s
count(str, 0);
}

void main()
{
int n;
scanf_s("%d", &n);
printNumber(n);
system("pause");
}


打印1到最大的n位数C语言

阅读之前注意

思想程序

问题源于《剑指Offer 名企面试官精讲典型编程题》何海涛先生著.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: