C++打印位数为n的所有数

第一种方法:数组和递归实现
#include <iostream>
using namespace std;

void General(int b[], int n,int k)
{
    if (n <= 0)//k是打印位数,n是递归剩余位数。
    {
        if (k != 1)
        {
            while (b[k - 1] == 0)//去掉最高位的0
            {
                k--;
            }
            if (k == 1)return;
        }
        for (int j = k-1; j >=0; j--)
        {
            cout << b[j] << " ";
            if (j == 0)cout << endl;
        }
        return;
    }
    for (int i =0; i < 10; i++)//我感觉我还不是很得心应手。
    {
        b[n-1] = i;
        General(b, n - 1,k);//一位一位的递归赋值,赋值范围是0-9
    }
}
void Grial(int n)
{
    if (n <= 0)return;
    int *b = new int[n];//在vs2013中不能使用b[n],因为它会认为n是一个未初始化的值。
    memset(b,0,n);
    for (int i = 1; i <= n; i++)
    {
        int k = i;
        General(b,i,k);
    }
}

int main()
{
    Grial(3);
    return 0;
}

第二种方法,字符串实现:

#include <iostream>
using namespace std;

void ADD(char *str,int n,int &x)
{
    int flags = 1;
    char *p = str + n - 1;
    while (flags != 0)
    {
        flags = 0;
        if ((*(p) + flags - ‘0‘) == 9)
        {
            flags = 1;
            *(p) = ‘0‘;
        }
        else
        {
            *(p) = *(p)-‘0‘ + ‘1‘;
        }
        p--;
        if (*str == ‘9‘ && flags == 1 && *p==‘9‘)//如果最高位已经为9了,且次高位也为9,flags=1
        {                                       //那么判断已经结束,将标志位设置为1,返回终止。
            x = 1;
            return;
        }
    }
}
void Printf(char *str)//打印,除去首部的0
{
    char *p = str;
    while (*p == ‘0‘)
    {
        p++;
    }
    cout << p << endl;
}

void Grial(int n)
{
    if (n <= 0)return;
    char *str = new char[n];
    memset(str,‘0‘,n);
    *(str + n) = ‘\0‘;
    int flags = 0;//作为结束标志。
    while (1)
    {
        Printf(str);
        ADD(str,n,flags);//加1.
        if (flags == 1)
            break;
    }
}
int main()
{
    Grial(2);
    return 0;
}
时间: 2024-11-05 16:11:49

C++打印位数为n的所有数的相关文章

hdu3555---Bomb(数位dp,水)

Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49&quo

条件语句;for循环 嵌套复习

//打印数字,0,1,8,10,12,每一个数单独占一行 //在全部数字打印完毕之后在打印数字的个数和所有数的和 int count = 0; int sum = 0; for (int i = 0; i <= 12; i++){      switch (i)      {               case 0:               Console.WriteLine(i);               count++;               sum += i;       

Python中的if、for、while、break练习题

1.给定一个不超过五位的正整数,判断其有几位,依次打印出个位.十位.百位.千位.万位的数字. i=int(input(':')) if i/1000>10: r=5 elif i/1000>1: r=4 elif i/100>1: r=3 elif i/10>1: r=2 else: r=1 ↑↑以上是判断数字的位数,并用r表示. print(r,end=' ') 打印位数,将换行符替换为空格. p=i for j in range(1,r+1): 接下来是取每一位的数字,几位数就

python学习笔记-输入输出

格式化输出 print(format(value,format_spec)),其中3为打印位数,2f为精度 print(format(12.2356, '3.2f')) print(format(0.23456,'.1%')) D:\Python27\python.exe F:/Self-Study/python-study/input_output.py 12.24 23.5% python学习笔记-输入输出

Python解决 从1到n整数中1出现的次数

最近在看<剑指Offer>,面试题32的题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1.10.11和12,1一共出现了5次. 对于书中说的不考虑时间效率的解法很好理解,可以直接完成,但是对于书中介绍的另一种方法,没有理解,于是按照自己的思路进行了分析. 1位数,1-9中,1一共出现了1次: 2位数,10-99中,10-19的十位上一共出现了10*1=10次,对于每个十位开头的数字10-19.20-29,每个数个位上出现的

pythonday1笔记

#######练习题######## print('1.使用while循环打印输入 1 2 3 4 5 6 8 9 10')# num = 1# while num <= 10:# if num == 7:# num = num + 1# continue# else:# print(num)# num += 1#######################################################2.打印1-100所有数的和# sum = 0# count = 1# wh

Python练习题 024:求位数及逆序打印

[Python练习题 024] 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. ---------------------------------------------- 这题如果不用递归,实在太简单了!!!代码上: str = input('请输入一个不多于5位的正整数:') print('这个数字是%s位数,逆序为%s.' % (len(str), str[::-1])) 输出结果如下: 请输入一个不多于5位的正整数:45931这个数字是5位数,逆序为13954

输入一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

package com.hanqi; import java.util.*; public class Nixudayin { public static void main(String[] args) { // TODO 自动生成的方法存根 System.out.println("输入一个不多于5位的正整数"); Scanner shu=new Scanner(System.in); String a=shu.next(); System.out.println("输入的

剑指offer——打印从1到最大的n位数

因为unsigned int甚至unsigned long类型不一定能表示很大的n位数,它们的表示范围是一定的,所以可以使用字符串来存储,并打印 bool Incerment(char*& str,int n)//每次调用这个函数都会对字符串进行数值的加1 {     int index = n-1;     int tmp = str[index] - '0' + 1;     int offset = 0;     while (index>0){//如果index==0则表示已经超出了