C - 判断回文数
题目链接
思路分析:当作字符串,判断对称位置上的字符是否相同。
代码:
#include <bits/stdc++.h>
using namespace std;
bool judge(char str[])
{
int len=strlen(str);
for(int i=0; i<len; i++)
{
if(str[i]==str[len-i-1])
{
return true;
}
else
return false;
}
}
int main()
{
char s[10];
while(scanf("%s",s)!=EOF)
{
if(judge(s))
{
printf("Yes\n");
}
else
printf("No\n");
}
return 0;
}
G - 输出图形
思路分析:首先观察第i行输出i个数,然后把1-n(n+1)/2的数字存放至数组。设置一个下标记录k,每输出一个数字,k累加1。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,str[50];
while(scanf("%d",&n)!=EOF)
{
m=n*(n+1)/2;
for(int i=1; i<=m; i++)
{
str[i]=i;
}
int k=1;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=i; j++)
{
if(k==10)
printf("%5d",str[10]);
else if(j>1)
printf("%4d",str[k]);
else
printf("%d",str[k]);
k++;
}
printf("\n");
}
}
return 0;
}
E - 十六进制不进位加法
思路分析:首先对于两个数字,应该当成字符串处理。首先应该把数字补0对齐,然后进行加法运算。注意运算过程中,应该把字符转化为数字进行运算,得到结果后要对16进行取余(因为不进位操作),然后在转化为字符。
这道题很好的练习了字符串,数字,大小写字母之间的转化。很好。
代码:
#include <bits/stdc++.h>
using namespace std;
string transfor(string str)//把小写字母转化为大写字母
{
for(int i=0; i<str.size(); i++)
{
if(str[i]>='a'&&str[i]<='z')
{
str[i]-=32;
}
}
return str;
}
int ChartoInt(char c)//字符转化为数字
{
if(c>='0'&&c<='9')
return c-'0';
else
return c-'A'+10;
}
char InttoChar(int x)//数字转换为字符
{
if(x>=0&&x<=9)
return x+'0';
else
return x-10+'A';
}
string add(string s1,string s2)
{
for(int i=s1.size(); i>=0; i--)
{
int result=ChartoInt(s1[i])+ChartoInt(s2[i]);
s1[i]=InttoChar(result%16);
}
return s1;
}
int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
transfor(s1);
transfor(s2);
while(s1.size()<s2.size())
{
s1='0'+s1;//补零对齐
}
while(s2.size()<s1.size())
{
s2='0'+s2;//补零对齐
}
cout<<add(s1,s2)<<endl;
}
}
F - 最大子串和
输入n个整数的序列,求它的最大子串和,并输出对应的数。
输入描述:
多组测试数据。
第一行输入一个整数n(0<n<=100)。
接下来一行输入n个数用空格隔开,保证每个数的绝对值小于1000。
输出描述:
第一行输出所求子串的序列,如果有多个答案,输出靠前的答案。
第二行输出最大子串和。
输入样例#:
5
-10 5 2 -8 7
输出样例#
5 2
7
思路分析:利用了动态规划的思想。用一个dp[]数组存放序列和,如果后面的数字小于前面的序列和与自己的和,则dp[i]更新为两者之和;如果该数字大于前面的序列和与自己的和,则抛弃前面的序列。此时dp[i]最大。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
int a[maxn];
int dp[maxn],ansp,ansq,ans;
void DP(int n)
{
int p=0,q=0;
dp[0]=a[0];
ans=dp[0];
for(int i=1; i<n; i++)
{
if(a[i]>a[i]+dp[i-1]) //遇到一个数他可以覆盖前面数的和
{
dp[i]=a[i];
p=i;//更新起点
q=i;//更新终点
}
else
{
dp[i]=a[i]+dp[i-1];
q=i;//只需要更新右边界
}
if(ans<dp[i])
{
ans=dp[i];//每次都更新最大值;
ansp=p;
ansq=q;
}
}
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0; i<n; i++)
{
cin>>a[i];
}
DP(n);
for(int i=ansp; i<=ansq; i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
cout<<ans<<endl;
}
}