天津大学901考研程序设计题练习题(一、二、三)
1、练习题一
1.1 最大连续子序列
#include<iostream>
using namespace std;
const int MAXN = 1e4+4;
int a[MAXN];
// 动态规划 dp[n] = max(0, dp[n-1]) + num[n] (dp[n]表示以第n个数结尾的最大连续子序列的和)
int main(){
int n;
while(cin>>n){
for(int i=0;i<n;++i)cin>>a[i];
int sum = a[0],msum = a[0],tmp,start = 0, end = 0; // 求和,最大和 以及所在[start, end]
for(int i=1;i<n;++i){
if (sum>0) sum+=a[i];
else sum = a[i],tmp = i; // 存起始位置
if (sum > msum) {
msum = sum ;
end = i;
start = tmp;
}
}
if (msum<0) cout<<0<<" "<<a[0]<<" "<<a[n-1]<<endl;
else cout<<msum<<" "<<a[start]<<" "<<a[end]<<endl;
}
return 0;
}
2、练习题二
2.1 回文数猜想
#include<iostream>
#include<vector>
using namespace std;
int a[10],cnt; //存放数的每位 长度
void itoa(int n){
cnt = 0;
while(n){
a[cnt++] = n%10;
n/=10;
}
} // 将数n 的每一位存放在数组里
bool judge(int b[],int n){
for(int i=0,j=n/2;i<j;++i){
if(b[i]!=b[n-i-1])return false;
}
return true;
}// 判断是否为回文数
int atoi(int b[],int n){
int sum = 0;
for(int i=0;i<n;++i)sum=sum*10+a[i];
return sum;
}// 将数组转换为int 在这里求得是该数的倒序数
int main(){
int n;
while(cin>>n){
itoa(n);
vector<int> tmp; // 缓存中间结果
tmp.push_back(n);
while(!judge(a,cnt)){
n += atoi(a,cnt);
tmp.push_back(n);
itoa(n);
}
cout<<tmp.size()-1<<endl<<tmp[0];
for(int i=1,len=tmp.size();i<len;++i){
cout<<"--->"<<tmp[i];
}
cout<<endl;
}
return 0;
}
2.2 18岁生日
#include<cstdio>
using namespace std;
bool isLeap(int n){
return (n%400==0)||(n%100!=0&&n%4==0);
}
int main(){
int n,year,month,day;
scanf("%d",&n);
while(n--){
scanf("%d-%d-%d",&year,&month,&day);
if(month == 2 && day == 29) {
printf("-1\n");
continue;
}// 存在则是闰年,加上18后,不是4的倍数,也就不是闰年
int y = year + 18;
int ans = 0;
// 出生年为闰年且,月份<3
if (isLeap(year)&&month<3) ans++;
if (isLeap(y)&&month>2) ans++;
for(int i=year+1;i<y;++i){
if(isLeap(i))ans++;
}
printf("%d\n",365*18+ans);
}
return 0;
}
3、练习题三
3.1 Sky 数
#include<iostream>
using namespace std;
int sumRadix(int n,int radix){
int sum = 0;
while(n){
sum += n%radix;
radix/=radix;
}
return sum;
}// 把10进制数n 转换radix进制 并把位数求和
int main(){
int n;
while(cin>>n){
if(sumRadix(n,10)==22&&sumRadix(n,12)==22&&sumRadix(n,16)==22)
cout<<"#"<<n<<" is a Sky Number.";
else cout<<"#"<<n<<" is not a Sky Number.";
}
return 0;
}
3.2统计难题
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<string> words;
int main(){
string s;
while(getline(cin,s)){
if(s.size()==0)break; // 单词表读取完毕
words.push_back(s);
}
while(getline(cin,s)){
int len = s.size(),ans=0;
for(int i=0,slen=words.size();i<slen;++i){
if(len<=words[i].size()&&words[i].substr(0,len)==s)ans++;
}// 前缀的长度要小于字符串的长度,然后遍历单词表,截取前缀判断是否相等
cout<<ans<<endl;
}
return 0;
}