博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer:打印从1到最大的n位数
阅读量:5157 次
发布时间:2019-06-13

本文共 1446 字,大约阅读时间需要 4 分钟。

题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999

陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或long long都会溢出,故使用字符串来模拟数字加法

#include 
#include
#include
void print_cur_number(char *s){ char *p = s; while( *p != '\0' ) { if( *p == '0' ) // 找到第一个非0数字的位置 p++; else break; } printf("%s\n",p);}int increase_one(char *s){ int i; int len = strlen(s); int carry = 0; // 进位标志 int over = 0; // over=1, 表示当前值已经是n位数的最大值了, 再+1将成为n+1位数 for( i=len-1; i>=0; i-- ) { int sum = s[i]-'0'+carry; if( i == len-1 ) ++sum; // 第一次循环, 最低位+1 if( sum>=10 ) // 当前位>=10, 需要往高一位进一 { if( i==0 ) // 发生最高位的进位,说明当前值(未+1之前)已经是n位数的最大值了 over = 1; else // 非最高位的进位 { sum -= 10; s[i] = '0'+sum; carry = 1; } } else // 当前值+1之后, 未发生进位, 结束循环 { s[i] = sum +'0'; break; } } return over;}void print_to_max_n_digit(int n){ char *s = malloc(n+1); memset(s, '0', n); s[n] = '\0'; if( n<=0 ) return ; while( !increase_one(s) ) { print_cur_number(s); } free(s);}int main(void){ int n; printf("打印1-最大的n位数,请输入n: "); scanf("%d",&n); print_to_max_n_digit(n); return 0;}

转载于:https://www.cnblogs.com/DayByDay/p/3864279.html

你可能感兴趣的文章
几年前毕业设计做的CAD二次开发
查看>>
命名空间
查看>>
索引的创建和使用
查看>>
Bouncy Castle内存溢出
查看>>
多线程_java多线程环境下栈信息分析思路
查看>>
机器学习数学【1】
查看>>
Problem E: Automatic Editing
查看>>
Java数组排序
查看>>
SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询
查看>>
Shiro的校验Session是否过期处理的过程
查看>>
特征,特征不变性,尺度空间与图像金字塔
查看>>
《DSP using MATLAB》Problem5.33
查看>>
《DSP using MATLAB》Problem 6.17
查看>>
微信公众平台开发实战Java版之如何网页授权获取用户基本信息
查看>>
beta阶段第一次scrum meeting
查看>>
python3使用套接字遇到TypeError: 'str' does not support the buffer interface如何解决
查看>>
面向对象
查看>>
UI小组件学习
查看>>
样式规则
查看>>
表单美化
查看>>