3月15-3月20号内容总结

总结:

函数rand()与strand(),time():

rand():以某个随机数种子产生随机数。
注:这种随机数不是真正的随机数,相同随机数种子产生的随机数是相同的
例:

	int a,b;
    a=rand();
    cout<<a<<endl;
    b=rand();
    cout<<b<<endl;

第一次执行上面的代码输出的数据:
41
18467
第二次执行输出的数据同样是:
41
18467

srand():用于设置rand()使用 的随机数种子。
注:在调用rand()之前没有调用srand()则系统会默认设置一个srand(1);

函数原型:
void srand(unsigned seed);
seed:srand的种子,用于初始化srand的起始值。

time():获取系统的时间
包含头文件: time.h
调用:
1.time(&a)//a为time_t型变量
2.time(NULL);

利用srand(),time()可以为rand()提供一个不断变化的随机数种子。
形式:srand(time(NULL));
例:

   srand(time(NULL));
   int a;
   a=rand();
   cout<<a;

每次输出a的值都是随机的。

函数max(a,b),min(a,b):

max(a,b):比较a与b的大小,返回最大值
min(a,b):比较a与b的大小,返回最小值

memset函数:

包含头文件:memory.h
作用:将某元素,数组等的数据用别的值替换
调用;
memset(地址,用于替换的字符,大小);
注:该函数一般用于给数据清零或者给字符型数组以字符或者ASC码换值。
大小:指需要替换的元素的总字节数
例:

	int a[5],b[5],k;
    char c[5],d[5];
    memset(a,0,sizeof(a));
    memset(b,1,sizeof(b));
    memset(c,97,sizeof(c));
    memset(d,'a',sizeof(d));
    for(k=0;k<5;k++)
        cout<<a[k]<<endl;
    for(k=0;k<5;k++)
        cout<<b[k]<<endl;
    for(k=0;k<5;k++)
        cout<<c[k]<<endl;
    for(k=0;k<5;k++)
        cout<<d[k]<<endl;
输出:
0
0
0
0
0
16843009
16843009
16843009
16843009
16843009
a
a
a
a
a
a
a
a
a
a

ios::sync_with_stdio(false):

cin,cout的效率要比scanf,printf的效率要低是因为cin,cout要先把输入/输出的数据存入缓冲器再输入/输出,因此导致cin,cout的效率降低。

而ios::sync_with_stdio(false);的作用就是关闭iostream的缓冲器,让cin,cout的效率与scanf,printf的效率相差不大.
例:

int main()
{
    ios::sync_with_stdio(false);
    ......
}

在执行getline()函数时被跳过:

如下代码:

    string x;
    int a,k;
    for(k=0;k<3;k++)
    {
        cout<<"x:";
        getline(cin,x);
        cout<<"a:";
        cin>>a;
    }
输出:
x:a
a:4
x:a:5
x:a:1

可以看到,在第二次循环开始getline就被跳过了

原因:
1.cin输入不接收回车。每次按回车键结束输入后回车会被cin吐出,回车依旧存在直到被接收。
而能够接收回车的有getline(),cin.ignore,cin.get等。
又因为getline(),cin.get接收回车的同时会执行回车的指令且不需要回车前有任何数据,因此造成了getline被跳过的现象。
注:cin不接收回车但也会执行回车的指令,但必须在回车前要有正常的数据,否则无法执行回车的指令,并且会将该回车无效化
例:

	char a,b,c,d;
    cin>>a;
    cin>>b;
    cin>>c;
    cin>>d;
    cout<<a<<endl<<b<<endl<<c<<endl<<d;
输出:
abcd//此处输入了a,b,c,d,回车。
a//第一个cin接收了字符a并执行了回车,并将多出的,无法接收的数据b,c,d以及回车吐出
b//第二个cin接收了字符b并执行了上一个cin吐出的回车
c
d
    int a,b,c;
    cin>>a;
    cin>>b;
    cin>>c;
    cout<<endl;
    cout<<a<<endl<<b<<endl<<c;
输出:
5
5//因为在上一个cin吐出的回车之前无正常的数据可接收,所以将上一个回车无效化,并重新输入
5

5
5
5
    int a;
    string b,c;
    cin>>a;
    getline(cin,b);
    getline(cin,c);
    cout<<endl;
    cout<<"a:"<<a<<endl<<"b:"<<b<<endl<<"c:"<<c;
输出:
4
a//因为第一个getline接收了回车且直接执行回车的指令,所以第一个getline被跳过而第二个getline可正常进行

a:4
b:
c:a

解决getline被跳过的方法:
在需要正常执行的getline上面写一行能够接受回车的代码;

此处建议使用cin.ignore()函数;
cin.ignore(a,b)函数: a:数字,b:字符

含义:在cin.ignore处输入数据并提取部分字符,抛弃所提取的字符。每抛弃一个字符,计数器加1同时比较字符。如果计数器的数值达到a或者被抛弃的字符是b则cin.ignore(a,b)函数执行终止。并且吐出未被抛弃的字符,这些被吐出的字符则被下一个输入流接收。
例:

	string a;
    cin.ignore(5,'a');
    getline(cin,a);
    cout<<a;
/*
dsftlkawgb//a在第7位
kawgb
Process returned 0 (0x0)   execution time : 15.217 s
Press any key to continue.

dsfatrrzl//a在第4位
trrzl
Process returned 0 (0x0)   execution time : 16.397 s
Press any key to continue.
*/

注:回车代表一个字符,在抛弃回车后计数器加一

用cin.ignore解决getline()被跳过的代码示例:

    string b;
    int a;
    cin>>a;
    cin.ignore(0xfffff,'\n');//注:\n指回车,同样可以用EOF指回车
    cout<<"a:"<<a<<endl;
    getline(cin,b);
    cout<<"b:"<<b;
输出:
5
a:5
as
b:as

贪心算法的部分总结+感悟

贪心算法是一种求最优解的算法思想。通过局部最优解反馈到整体的最优解。
解决贪心算法问题的核心是找到贪心策略。
解决贪心算法的问题不是直接从总体下手而是从局部下手,通过找局部的最优解一步一步优化到整体的最优解,这样才能够更快找到贪心策略。
但尽管如此我有时还是会找不到最好的贪心策略,明明自己测试时都能够成功但是交上去就总是超时。所以我觉得想要找到好的贪心策略还应该有着良好的数学基础,找到最快的运算方法。

感悟:

学习C++时不能只学习纸上的代码,还要发散自己的思维,尝试多种多样的情况,这样能够发现代码真正的意思,了解到代码到底是如何执行的。发散思维不仅能帮助我们了解代码,还能够促使我们去学习更多的代码或代码的执行方式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值