打印1到最大的n位数


题目描述:打印1到最大的n位数,输入数字n,按顺序打印出从1到最大的n位十进制数。

比如:输入3,则打印出1、2、3一直到最大的3位数999.


题目分析:

[陷阱]:这个题目很容易想到的办法就是先求出最大的数。然后循环输出就可以

解决这个问题最常用的方法是用字符串或者数组表达大数.
下边我们介绍这两种表示方法:

用数组表示大数
数组内的每一个成员只表示大数里的一位。
如数组int a[100]表示:123456789
a[0]为符号位,值为1时为正数,值为-1为负数(值可以自己定义)
a[1]=1;
a[2]=2;
a[3]=3;~~~;a[9]=9;
最后定义一个结束位a[10]=-999;(-999是结束的标志,可以自己定义)
如果要用大数进行运算则要重写四则运算法则。
重写加减法较为简单,乘除法则较为复杂,需要花大量时间设计。
一般来说存储使用字符串数组如:char a[100],运算时则转化为
数值数组:int a[100]。[]中的100为数组长度,大数长度必须在100-2的范围内
才能正确表示。数组长度由自己定义。

用字符 串表示大数:
总体思想:按照小学算术运算计算,按位运算从数组最高位,一个个的取出来相加(当然的先把单个字符转换为整型),记住进位,循环计算 
需要做的事情: 
(1)判断输入的字符串是否为数字(特别要考虑小数点,如果做除法,被除数不能为0) 
(2)比较2个字符串长度大小,对长度小的字符串左边补0 
面试题1:如果系统要使用超大整数(超过long的范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数的加法运算 。 
分析: 
1、判断输入的字符串是否为数字 
短字符串左边补0 
把两个的长度做比较,在左面补0,使之与较长的字符串一样长   
2、转换为整数按位运算 
按位运算从数组最高位,一个个数的取出来相加(当然的先把单个字符转换为整型) 
5、设置进位 
result=a+b+jw两个数相加及加上进位 
1)if>10,并且这不是最左边一个字符相加,相加结果等于result=result-10,并把进位设为1; 
2)如果没有大于10,就把进位设为0 

如些循环,把相加的结果以字符串的形式结合起来,就得到最后的结果 


以下我们采用字符串表示大数
最直观的方法就是字符串里每个字符都是’0’到’9’之间的某一个字符,用来表示数字中的一位。因为数字最大是n位的,因此我们需要一个长度为n+l的字符串(字符串中最后一个是结束符号’\0’)。当实际数字不够n位的时候,在字符串的前半部分补0。
首先我们把字符串中的每一个数字都初始化为’0’,然后每一次为字符串表示的数字加1,再打印出来。因此我们只需要做两件事:一是在字符串表达的数字上模拟加法,二是把字符串表达的数字打印出来。
代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void Print(char *number, int n)
{
    int i = 0;
    for (i = 0; i<n; i++)
        if (number[i] != '0')
            break;
    if (i == n)   
        return;
    for (; i<n; i++)
        printf("%c", number[i]);
    printf(" ");
}
 
void PrintRecursively(char *number, int n, int index)
{
	int i=0;
    if (index == n)
    {
        Print(number, n);
        return;
    }
 
    for (i = 0; i<10; i++)
    {
        number[index] = i + '0';
        PrintRecursively(number, n, index + 1);//递归
    }
}
 
void PrintToMaxOfNDigits(int n)
{ 
	char *number = (char *)malloc((n+1)*sizeof(char)); 
    if (n <= 0)
        return;
   
    memset(number, '0' ,sizeof(number));
    number[n] = '\0';
    PrintRecursively(number, n, 0);
    free(number);
}
 
int main()
{
    int n;
    scanf("%d", &n);
    PrintToMaxOfNDigits(n);
    system("pause");
    return 0;
}
 

运行结果:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值