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;
}