1024.5不是数位和--------题解
前言
gogogo,完成这个题目的整理,咱们将要开始整理运行超时问题和数组越界问题的解决方案,然后再背60个单词,看一节提醒课程。
题目



解法
#include<bits/stdc++.h>
using namespace std;
int main(){
// string m;char m[1000000001];long long int sum = 0;
// cin>>m;scanf("%1000000000s",m);long long int size = strlen(m);
// long long int size = m.size();for(int i=size-1;i>=0;i--){
// sum+=(m[i]-97)*pow(13,size-1-i);//这个只能过50%sum+=(m[i]-'a');//这个可以过100%}if(sum!=0&&sum%3==0){cout<<1<<' ';}else{cout<<0<<' ';}if(sum!=0&&sum%4==0){cout<<1<<' ';}else{cout<<0<<' ';}return 0;
}这里我的思路就是通过通过判断数位和是否能被3或者4整除来判断这个数能否被3或者4整除。
反思
1.考察知识点:数学知识,字符串的输入输出;
2.踩的坑:
2.1.首先是pow这个函数,没有记清楚;
2.2.其次是在这个pow这个内构函数,要求里面的变量类型必须是一致的,我一开始用的是int类型的13和long long int 类型的size-1-i,如果数据量小的话还是可以正常通过的,但是数据量大了就算不了了;
2.3.再其次就是关于这个字符串输入的问题了,一开始我用string和cin进行输入,最终导致有一半的样例错误以及运行超时,后来借鉴他人的题解改成了char数组和scanf,就没有再出现这种情况了,经过查阅资料我知道了,string的输入效率低于char数组(尤其是处理超大规模字符串时),另外scanf是直接操作内存的底层输入,而cin是会做同步缓冲区加格式校验,每次输入都会经过多层判断,所以遇到大规模字符处理时,尽可能采用char数组和scanf,或者用这些语句(明天再来整理):
#include<bits/stdc++.h>
using namespace std;
int main(){string m;m.reserve(1000000001); // 提前分配内存,避免动态扩容耗时ios::sync_with_stdio(false); // 关闭cin与stdio的同步,大幅提升速度cin.tie(nullptr); // 解绑cin和cout,进一步提速cin >> m; // 此时string输入速度≈scanflong long sum = 0;for(int i = m.size()-1; i >=0; --i){sum += (m[i] - 'a');}// 后续判断输出不变...return 0;
}2.4.还有就是strlen函数和.size()关键字的区别,前者是C语言风格的函数,仅能用来处理char数组,而后者呢,是C++风格的,仅能用来处理string类型的字符串。
2.5最后就是关于这个数组的长度和scanf里面为什么都有这么多的‘0’,这里经过查阅资料得知,是为了防止scanf继续输入而使数据超过数组的范围使程序崩溃,具体为啥是10的9次方这个不得而知。
3.可以优化的地方:
根据踩坑的地方,首先将输入语句改成scanf和char数组;
其次,计算字符串长度也配套改成strlen.
然后数组和输入长度很重要,这个要问一下。
