精华内容
下载资源
问答
  • 字符串中的每一个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个长度为n+1的字符串,字符串的最后一个是结束符号‘\0’,当实际数字不够n位的是哦互,在字符...

    【面试题012】打印1到最大的n位数 

    大数问题

    字符串中的每一个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个长度为n+1的字符串,字符串的最后一个是结束符号‘\0’,当实际数字不够n位的是哦互,在字符串的前半部分补0。

    我们要做的是,在字符串上面做模拟加法,然后把字符串表达的数字打印出来。

     

    怎么判断增加的字符串是不是达到我们要求的最大的数字啦,这里很关键,isOverflow做判断,

    打印函数,也得定制,因为当数字不够n位的时候,我们在数字的前门补0,

     

    方法一,是模拟加法运算的过程,

     

    方法二,是n位所有的十进制数其实就是n个从0到9的全排列,也就是说,我么把数字的每一个位都从0到9排列一遍,就得到了所有的十进制数,

     

    PrintNum.cpp:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     

    #include <iostream>
    #include <cstring>
    #include <cstdio>

    using namespace std;

    void PrintNumber(char *number);
    bool Increment(char *number);
    void Print1ToMaxOfNDigitsRecursively(char *number, int length, int index);

    /*方法一*/
    void Print1ToMaxOfNDigits_1(int n)
    {
        if(n <= 0)
        {
            return ;
        }
        char *number = new char[n + 1];
        memset(number, '0', n);
        number[n] = '\0';

        while(!Increment(number))
        {
            PrintNumber(number);
        }

        delete []number;
    }

    /*
     * 字符串number表示一个数字,在number上增加1
     * 如果做加法溢出,则返回true,否者为false
     */

    bool Increment(char *number)
    {
        bool isOverflow = false;
        int nTakeOver = 0;
        int nLength = strlen(number);

        for(int i = nLength - 1; i >= 0; i --)
        {
            int nSum = number[i] - '0' + nTakeOver;
            if(i == nLength - 1)
            {
                nSum ++;
            }

            if(nSum >= 10)
            {
                if(i == 0)
                {
                    isOverflow = true;
                }
                else
                {
                    nSum -= 10;
                    nTakeOver = 1;
                    number[i] = '0' + nSum;
                }
            }
            else
            {
                number[i] = '0' + nSum;
                break;
            }
        }
        return isOverflow;
    }

    /*方法二*/
    void Print1ToMaxOfNDigits_2(int n)
    {
        if(n <= 0)
        {
            return ;
        }
        char *number = new char[n + 1];
        number[n] = '\0';

        for(int i = 0; i < 10; ++i)
        {
            number[0] = i + '0';
            Print1ToMaxOfNDigitsRecursively(number, n, 0);
        }
        delete[] number;
    }

    void Print1ToMaxOfNDigitsRecursively(char *number, int length, int index)
    {
        if(index == length - 1)
        {
            PrintNumber(number);
            return ;
        }
        for(int i = 0; i < 10; ++i)
        {
            number[index + 1] = i + '0';
            Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
        }
    }


    /*
     * 公共函数
     * 字符串number表示一个数字,数字有若干个0开头
     * 打印出这个数字,并且忽略开头的0
     */

    void PrintNumber(char *number)
    {
        bool isBeginning0 = true;
        int nLength = strlen(number);

        for(int i = 0; i < nLength; ++i)
        {
            if(isBeginning0 && number[i] != '0')
            {
                isBeginning0 = false;
            }
            if(!isBeginning0)
            {
                cout << number[i];
            }
        }
        cout << "\t";
    }

    /*测试代码*/
    void Test(int n)
    {
        printf("Test for %d begins:\n", n);

        Print1ToMaxOfNDigits_1(n);
        Print1ToMaxOfNDigits_2(n);

        printf("Test for %d ends.\n", n);
    }

    int main()
    {
        int n = 1;
        Print1ToMaxOfNDigits_1(n);
        Print1ToMaxOfNDigits_2(n);
        return 0;
    }

    运行结果:

    1       2       3       4       5       6       7       8       9           
    1       2       3       4       5       6       7       8       9 

     

    Makefile:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    .PHONY:clean  
    CPP=g++  
    CFLAGS=-Wall -g  
    BIN=test  
    OBJS=PrintNum.o  
    LIBS=  
    $(BIN):$(OBJS)  
        $(CPP) $(CFLAGS) $^ -o $@ $(LIBS)  
    %.o:%.cpp  
        $(CPP) $(CFLAGS) -c $< -o $@  
    clean:  
        rm -f *.o $(BIN)  

    转载于:https://www.cnblogs.com/codemylife/p/3695647.html

    展开全文
  • 很简单,把空白区域填充上一个个字符,***把字符当成空白***,这样就好理解了! 如下图: 看懂上一步后,那我们就开始找规律了。 这里先告诉大家可以使用一元一次线性方程求解! 我们先看上部分: 为了便于...

    使用for循环打印空心菱形图案

    打印空心菱形图案
    例: 首先我们要知道:
    1.外层循环控制的是图形的行数
    2.内层循环控制的是图形的列数

    在这里插入图片描述

    	看菱形图案的左侧有空白区域,这就造成了我们很难理解,空白区域该怎么弄,
    	才能打印出来呢?
    	很简单,把空白区域填充上一个个的字符,***把字符当成空白***,这样就好理解了!
    	如下图:
    

    在这里插入图片描述

    看懂上一步后,那我们就开始找规律了。
    这里先告诉大家可以使用一元一次线性方程求解!
    我们先看上半部分:
    为了便于计算,我们把菱形内部“ * ”也填充上。在这里插入图片描述
    紧接着计算 “ * ” 号
    如下图:
    在这里插入图片描述
    最后如何去控制空心
    呢?**
    我们可以在打印 “ * ”的时候去控制它
    第一个与最后一个打印“ * ”号;
    其他打印空白即可。
    下列代码演示:

    if(j==1 || j==(2*i-1)) {
    				System.out.print("*");
    			    }else {
    				System.out.print(" "); //字符串里面是一个空格!
    			    }
    

    接下来是完整的代码了!
    最好是 从1开始循环,不然从0开始你可能会晕的哦!
    先打印上半部分后打印下半部分,空白在每行前面,所以开始打印空白,后打印“ * ”号。
    空白与*都是控制列数,并列for循环即可!

                //上半部分
                 
    		for(int i= 1;i<=4;i++) {			//外层循环控制行数 
    			
    			
    			//线性求解即可!
    			//打印空白
    			for(int j=1;j<=4-i;j++) {		//内层循环控制列数
    				System.out.print(" ");      //空白
    			}
    			//打印“ * ”
    			for(int j=1;j<=2*i-1;j++) {		//内层循环控制列数
    				if(j==1 || j==(2*i-1)) {	//控制内部空白区域
    				System.out.print("*");
    			    }else {
    				System.out.print(" ");
    			    }
    			}
    			System.out.println();
    		}
    
    		//打印下半部分
    		
    		for(int i=1;i<=3;i++) {
    			for(int j=1;j<=i;j++) {
    				System.out.print(" ");
    			} 
    			
    			for(int j=1;j<=-2*i+7;j++) {
    				if(j==1 || j==-2*i+7) {
    				System.out.print("*");
    			}else {
    				System.out.print(" ");
    			}
    		}
    			System.out.println();
    
    	}
    
    展开全文
  • 你必须知道的495C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    例如定义一包含N指向返回指向字符的指针的函数的指针的数组? 1.22 如何声明返回指向同类型函数的指针的函数?我在设计一状态机,用函数表示每种状态,每函数都会返回一指向下一状态的函数的指针。可我...
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    书中列出了C用户经常问的400多经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495C语言问题》结构...
  • 例如定义一包含N指向返回指向字符的指针的函数的指针的数组? 11  1.22 如何声明返回指向同类型函数的指针的函数?我在设计一状态机,用函数表示每种状态,每函数都会返回一指向下一状态的函数的指针...
  • 例如定义一包含N指向返回指向字符的指针的函数的指针的数组? 1.22 如何声明返回指向同类型函数的指针的函数?我在设计一状态机,用函数表示每种状态,每函数都会返回一指向下一状态的函数的指针。可我...
  • 例如定义一包含N指向返回指向字符的指针的函数的指针的数组? 1.22 如何声明返回指向同类型函数的指针的函数?我在设计一状态机,用函数表示每种状态,每函数都会返回一指向下一状态的函数的指针。可我...
  • 书中列出了C用户经常问的400多经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 本书结构清晰,讲解透彻,是各高校相关...
  • 书中列出了C用户经常问的400多经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。  本书结构清晰,讲解透彻,是各高校...
  • 补发上周六的记录

    2017-11-30 16:06:38
    原本想给朋友们写一条满是“爱心”的简单代码,不能一眼看出内容,但是细看能看得懂的那种,结果发现控制字符的图案不能被打出来半个学期都过了,不能给他们做个小小的学习报告,实在是太可惜啦。我想,干脆自己画...

    2017.11.25.

    进了十二月就要年底啦,准备要给老友们寄一波明信片了。

    原本想给朋友们写一条满是“爱心”的简单代码,不能一眼看出内容,但是细看能看得懂的那种,结果发现控制字符的图案不能被打出来。半个学期都过了,不能给他们做个小小的学习报告,实在是太可惜啦。我想,干脆自己画个爱心给他们好了,而且不管代码写得怎么样,最好得是自己想的。

    我就着手画了个图,打算按着这个图来编。虽然写这个好像也没什么难的,可是就是老是打出乱码QAQ

    我以为二维数组只要定了“行”和“列”,它就会长成一个方块状 =。。=……结果,还是要在内层循环的外面加换行符的。

    重点是,我找到了一个叫memset的东西。虽然好像这个叫memset的东西之前师哥们用过,可是没到我想到要用来干嘛的时候(没到自己真的想用的时候?),我就记不起有这个东西。。。

    目前我只知道,这玩意能对二维数组进行相同数值的初始化,然后用的时候要加上头文件<string.h>,初始化好像只能赋值为0或-1。输入成其他的数会出现乱码……

    哦对了,这周我还学到了一个叫sort的东西(虽然这玩意师哥以前也讲过,我翻了一下笔记,大概在第一堂课QAQ)。我似乎是刚认识它一样……这大概是被动学习和主动学习的差异?以后我得去多多使用、了解它。

    最后 = = +,我要给这个心起名为003,要在给他们写的信里埋个伏笔~

    我终于可以贴代码啦QwQ:

    “爱你们哟”


    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int main()
    {
        char a[10][25];
        memset(a, 0, sizeof(a));
        char n = '*';
        for(int i = 0; i < 10; ++i)
        {
            for(int j = 0; j < 25; ++j)
            {
                if( (i==0) && (j==7||j==15) ){a[i][j] = n;}
                if( (i==1) && (j==5||j==9||j==13||j==17) ){a[i][j] = n;}
                if( (i==2) && (j==3||j==11||j==19) ){a[i][j] = n;}
                if( (i==3) && (j==2||j==20) ){a[i][j] = n;}
                if( (i==4) && (j==3||j==19) ){a[i][j] = n;}
                if( (i==5) && (j==5||j==17) ){a[i][j] = n;}
                if( (i==6) && (j==7||j==15) ){a[i][j] = n;}
                if( (i==7) && (j==9||j==13) ){a[i][j] = n;}
                if( (i==8) && (j==11) ){a[i][j] = n;}
                cout << a[i][j];
            }
            cout << endl;
        }
        return 0;
    }

    展开全文
  • 括号,这是一道普通的DFS+字符串处理题,但对于与我这种平时不怎么碰STL的人来说,光是看题解就足足看了半个小时(我有多弱就不解释了吧),最后硬是照着别人的题解才勉强打出来了。 但说实话,这道题带给我的小知识...

    我的第一篇解题报告( -。- )  

    原题点这里

    括号,这是一道普通的DFS+字符串处理题,但对于与我这种平时不怎么碰STL的人来说,光是看题解就足足看了半个小时(我有多弱就不解释了吧),最后硬是照着别人的题解才勉强打出来了。


    但说实话,这道题带给我的小知识倒真的不少,可以简单的在这列一下(如果有和我一样的难兄难弟可以一起看一下哦!)


        1. vector的下标是从 0 开始记录的,而它的size函数则是返回vector内的元素个数,其意是:当你只用push_back函数无脑存储元素时,应当从 0 一直枚举到 size-1 !


        2.vector是可以直接用下标访问的!(在代码中可以看到)


        3.string可以直接用相加的方式(+) 来合成串!(同样也可以在代码中看到)


         4.函数的返回值居然若此多样!



    题目分析

        这是一道喊你添加括号的DFS题,那么首当其冲的一步,就是应该先知道怎样添加括号,于是乎,我们觉醒了在小学时学习乘法时的各种经验,便一下得出了以下结论

       1. 对于单独的两个元素(比如 “z" 和 “b”,它们都是在题目中直接给出的数据),要把它们组合成一个串(至少包含两个元素),那么会有:(z*b)

        2. 对于一个单独的元素(还是“z“)与一个串(比如简称它为 “h”)要把它们组合成一个更大的串,那么会有:(zh)

        3.同2, 对于一个串和另一个串(比如为“c”和“h”),要把它们组合成一个更大的串,那么会有(ch)

             

       然后,在得到了这个结论以后,这一切就没什么好说了,我们的任务就是用DFS顺序来切割子串,贴上借鉴大神的程序,努力分析,一起提升吧(真的是一起么...)

        

    #include<vector>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    const int N=10+5;
    
    string str[N];
    
    int n; 
    
    vector<string> Dfs(int l,int r){  // 返回值是vector,存放的是当前括号分割下的所有复合串,然后继续搜索,找出所有可能 
                                      // Dfs(l,r)表示寻找用在(l,r)的数据集合内括号分割所有可能串,而(1,n)即是我们的最终答案 
        vector<string> v;
        
        if ( l==r ){ // 特殊情况1:只有一个元素  
        
            v.push_back(str[l]);   
            return v;
         
        }    
        
        if ( l+1==r ){ // 特殊情况2:是两个元素结合成串 (即结论1) 
        
           string s="("+str[l]+"*"+str[r]+")"; 
           v.push_back(s);
           return v;
         
        }
        
        // 正常情况:串与串 或 元素与串 结合(即结论2,3)  
        for(int cut=l;cut<r;cut++){
        
            vector<string> left=Dfs(l,cut);
            vector<string> right=Dfs(cut+1,r);
            
            for(int i=0;i<left.size();i++)
              for(int j=0;j<right.size();j++){  // 下标有毒,小心 
              
                  string s="("+left[i]+right[j]+")";
                  v.push_back(s);
                
              }// 这里可能会误导大家,但这只是枚举每个左子串和右子串,将它们两两结合,生成所有可能的复合串的操作罢了   
              
        }    
        
        return v;
    
    }
    
    int main(){
    
        cin>>n;
        
        for(int i=1;i<=n;i++) cin>>str[i]; // 读入数据串 
    
        vector<string> ans=Dfs(1,n); // vector里存放了所有满足括号分割的复合串 
        
        for(int i=0;i<ans.size();i++) cout<<ans[i]<<"\n";  
        
      return 0;
    
    }
    

    或许下一次我不会写这么多了吧,额嘿嘿(真的多么...)


    2017.1.28




    展开全文
  • 这几乎是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种...
  • 疯狂的程序员

    热门讨论 2012-07-18 18:05:32
    一直过了半个月,这事情才总算落实,还像模像样跟人家签了代理合同。其实这家广告公司整个还没有他们寝室大,公司就两人:一个男的,一个女的。没办法,绝影想就这么一个小的公司,人家在容易就范。人家想,就这么一...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • Java面试宝典-经典

    2015-03-28 21:44:36
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • 不要超过 100 个字符) 【国宴大师•羊蝎子】史上最强酱汤羊蝎子秘方,保姆级教程,手把手教你做软烂脱骨又不膻的羊蝎子 简介 小友们好,熟悉老饭骨频道的可能都知道,老冯已经是...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • Java面试宝典2012版

    2012-12-03 21:57:42
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • java面试宝典2012

    2012-12-16 20:43:41
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • Java面试笔试资料大全

    热门讨论 2011-07-22 14:33:56
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • Java面试宝典2012新版

    2012-06-26 19:20:00
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • JAVA面试宝典2010

    2011-12-20 16:13:24
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • 不要超过 100 个字符) 厨师长分享:“炸鸡翅”的简单快捷做法,外壳酥脆,肉汁丰富,四伯评价很高! 简介 四伯四伯娘没怎么出过老家,真的没吃过肯德基麦当劳, ...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

半个字符怎么打出来