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

996.icu LICENSE

  • 思想+程序
  • 改进算法

阅读之前注意:

本文阅读建议用时:20min
本文阅读结构如下表:

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

1. 思想+程序

思想:

  1. 用字符串来表示大数,并实现加法
  2. 打印的时候注意符合阅读习惯(本程序未实现该功能)
    程序参考以下代码:
#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[n] != '9')
	{
		str[n]++;
		return;
	}
	else
	{	
		if (n == 0)
			return;
		str[n] = '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[n] = '\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

2. 改进算法

改进算法思路:采用排列组合的思想,可以遍历数的各种情况,第一个位置可以是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)//如果是个位上的数值变化就打印(字符串最右是个位,注意是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[n] = '\0';//字符串末尾是'\0'作为结束s
	count(str, 0);
}

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

如果本文对你有帮助,不如请我一杯可乐吧
在这里插入图片描述


  1. 问题源于《剑指Offer 名企面试官精讲典型编程题》何海涛先生著. ↩︎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值