T1:学习求余
正确代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("mod.in", "r", stdin);
freopen("mod.out", "w", stdout);
long long n;
cin>>n;
if(n%2){
cout<<(n+1)/2*(n/2);
}else{
cout<<(n/2+1)*(n/2-1);
}
return 0;
}
思路:如果n%2是是一的话,那么说明他是单数,n+1是为了把n变成双数再除以2,else中判断的是n是双数的情况。
错误代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("mod.in", "r", stdin);
freopen("mod.out", "w", stdout);
long long n,k;
cin>>n;
if(n>1){
k=n-1;
}else{
cout<<0;
return 0;
}
cout<<n%k*k;
return 0;
}
错误原因:问题想的不周全,没有审清题目,没有考虑到所有情况。
T2:提取数字
正确解法:
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("number.in", "r", stdin);
freopen("number.out", "w", stdout);
long long a,sum=0;
string s;
cin>>a>>s;
int len=s.size();
for(int i=0;i<len;i++){
if(isdigit(s[i])){
long long p=0;
while(isdigit(s[i])){
p=p*10+s[i]-'0';
i++;
}
sum+=p+5;
}
}
cout<<sum;
return 0;
}
思路:len值循环的次数,isdigit是判断是否为数字,p是一次循环的值,sum是总值,-‘0’代表把字符类型转换成数字类型,15行的i++是代表已经加过的值不再重复判断,13行while循环是为了判断后面的连续数字和之前的数字加在一起,变成一个数字。
错误解法:
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("number.in", "r", stdin);
freopen("number.out", "w", stdout);
int n,num=0,sum=0,u=0;//num一次的值,sum总结果,u判断了多少次
char d[100001];
cin>>n;
string s;
cin>>s;
int len=s.size();//判断长度
for(int i=0;i<len;i++){
d[i]=s[i];//转移
}
for(int i=0;i<len;i++){
//cout<<i<<endl;
if(d[i]<='9'&&d[i]>='1'){//判断是否为数字
u++;//判断次数加一
num=d[i]-'0';//把值传进num里
for(int j=i+1;j<len;j++){//判断后面是否跟了数字
if(d[j]<='9'&&d[j]>='1'){//判断数字
num=num*10;//给数字留出位置
num+=d[j]-'0';//输进数字
}else{
//cout<<"JHGF";
i=j;//把已经输入过的数字去除掉
break;
}
}
sum+=5;
}
sum+=num;//加到sum里
num=0;//一次循环后归零
//cout<<u<<endl;
}
cout<<sum;
return 0;
}