第四周

有关学习c++的笔记:

5

cin相当于c中的scanf,例如

cout << "输入一个数字";

cin >> i;

则i为2

cin不仅可以用于int也可以对float,double进行重载,全都可以很方便

6.

cin.ignore(7)

表示忽视前7个字符,如

一个数组buf【20】

输入: i love china   输出:china

7.

cin.getline(buf,10)

表示提取buf数组中的十个字符,和ignore共用可以表示为

char buf[20];

cin.ignore(7);    cin.getline(buf,10);

cout<

输入为:i love china i love china

输出为:china i l  (只所以会到l截止是因为,最后一个字符是‘\0’)(最后由cout来输出)

8.

cin.read(buf,10)

输入的buf数组字符中只提取十个可用(不包括'\0')(可由write输出)

cout.write(buf,10)

输出buf中的前十个

9.

cout.precision()表示输出输入流中的精度值

cout.precision(num)表示输出指定num的精度值

cout << setprecision(4) << value << endl   表示输出value的八个精度值,如value为1.34,则输出为1.345

cout << fixed << setprecision(4) << value << endl

fixed固定小数位,所限制的精度是给小数的,如1.34,输出为1.3435

另外是这周的一些题
http://acm.hdu.edu.cn/showproblem.php?pid=2031

源代码为:
#include<stdio.h>

#include<string.h>

int main()

{

    long N, R, i, s, b;

    long j;

    char a[1000];

    while(scanf("%d%d", &N, &R) != EOF)

    {

        if(R>=2 && R<=16 && R!=10 )

        {

            if(N==0)

            {

                printf("0\n");

            }

            if(N<0)

            {

                N = -N;

                b = 1;

            }

            if(N>0)

            {

            for(i=0;N!=0;i++)

            {

                j = N%R;

                if(j>=10)

                {

                    a[i] = j-10+'A';    //对于十进制数

                }

                else a[i] = j+'0';   //对于非十进制数

                N = N/R;

            }

            a[i] = '\0';

            s = strlen(a);

            if(b==1)

                printf("-");

            b = 0;

            for(i=strlen(a)-1;i>=0;i--)

            {

                printf("%c", a[i]);

            }

            printf("\n");

            }

        }   

    }

    return 0;

}
这道题的思路为:首先先求两个数相除的余数然后放入数组中,然后在求两个数的除数,用递归想法,用所得的除数在除与被除数,最后将数组中的数倒叙输出,即是进制后的答案

还有另外一题:
http://acm.hdu.edu.cn/showproblem.php?pid=2032

源代码为:
#include <stdio.h>

#include<string.h>

int main()

{

    int i, j, n, b;

    int a[32][32];

        while(scanf("%d", &n) != EOF)

        {

            if(n>=1 && n<=30)

            {

                for(j=0;j<n;j++)

                {

                    for(i=0;i<=j;i++)

                    {

                        a[j][i] = 1;             //重置数组中的所有数为1方便后续计算

                    }

                }

                for(j=2;j<n;j++)

                {

                    for(i=1;i<j;i++)

                    {

                        a[j][i] = a[j-1][i-1]+a[j-1][i];           //杨辉三角的基本性质

                    }

                }

                for(j=0;j<n;j++)

                {

                    b=0;

                    for(i=0;i<=j;i++)

                    {

                        if(b==0)

                            printf("%d", a[j][i]);

                        else printf(" %d", a[j][i]);

                        b++;

                    }

                    printf("\n");

                }

                printf("\n");

            }

        }

        return 0;

}
这道题的思路:只要理解杨辉三角的性质,就是一道简单的题,这道题的核心在于
1.第n+1行的第i个数等于第n行的第i个数+i-1个数
2.第n行的第i个数和第n+1-i个数相同,最后和第一个数都是为1;

以上两道题有个注意点是:
1.memset(buf, num, sizeof(buf))这个函数用于重置数组的数值很方便,但是却无法重置二维数组,这是因为,这个函数对于每一行,是连续分配的; 然而对于各行之间,却不是连续非配的,容易出错
2.2031的题要注意转为大于10进制数的时候A的进制,做题的时候一直漏掉这个导致浪费很多时间
3.对于2030的汉字统计的题,每个汉字是由两个字符组成的

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容