题目:
D-Sort
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000005];//这里要定义全局变量,否则会超时
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
//int a[1000005]如果这样定义会出现爆栈的情况,此时不能正常输入
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);//从大到小排序
printf("%d",a[0]);//输出格式调整
for(int i=1;i<m;i++)
printf(" %d",a[i]);
printf("\n");
}
return 0;
}
注:
局部变量分配在栈区。
全局变量内存分配在自由分配区;
F - 海选女主角
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100][100];
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
int max1=-1;
int row,line;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
if(abs(a[i][j])>abs(max1))//这里要注意是与max1的绝对值进行比较·
{
max1=a[i][j];
line=i;//行
row=j;//列
}
}
printf("%d %d %d\n",line,row,max1);
}
return 0;
}
G - C语言合法标识符
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char a[1005];
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
gets(a);
int flag=0;
if(!(a[0]>='A'&&a[0]<='Z'||a[0]>='a'&&a[0]<='z'||a[0]=='_'))
flag=1;
else
{
for(int i=0;i<strlen(a);i++)
{
if(a[i]>='A'&&a[i]<='Z'||a[i]>='a'&&a[i]<='z'||a[i]=='_'||a[i]>='0'&&a[i]<='9')
continue;//就是continue的巧妙用处
else
flag=1;
}
}
if(flag==0)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
K - Lowest Common Multiple Plus
AC代码:
方法一:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n;
int a[1005];
while(~scanf("%d",&n))
{
int max1=0;
int flag=0;
for(int i=0;i<n;i++)
{
scanf(" %d",&a[i]);
if(a[i]>max1)
max1=a[i];
}
for(int i=max1;;i++)
{
flag=0;//flag这里要不断初始化
for(int j=0;j<n;j++)
{
if(i%a[j]==0)
flag++;
}
if(flag==n)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}
AC代码:
方法二:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int Gcd(int a,int b)//求最小公约数
{
return b==0?a:Gcd(b,a%b);
}
int Lcm(int a,int b)//求最小公倍数
{
return a/Gcd(a,b)*b;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int m;
int a,b;
if(n==1)
{
scanf("%d",&m);
printf("%d\n",m);
}
else
{
for(int i=0;i<n;i++)//多个一次两个求最小公倍数
{
scanf("%d",&b);
if(i==0)
a=b;
else
a=Lcm(a,b);
}
printf("%d\n",a);
}
}
return 0;
}
注:求最小公约数可以使用C++的内置函数 “__gcd(a,b)”;
L - Palindromes _easy version
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char a[1005];
int main()
{
int n;
while(~scanf("%d",&n))
{
getchar();
while(n--)
{
gets(a);
int count1=0;
int len=strlen(a);
for(int i=0;i<len/2;i++)
{
if(a[i]==a[len-1-i])//就是将单词对半比较
count1++;
}
if(count1==len/2)
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}
代码二:
不知道为什么这个代码在VJ上会出现这样的错误。
问了同学之后,发现要用G++提交,就AC了。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string a;
string b;
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
getline(cin,a);
b=a;
reverse(a.begin(),a.end());
if(a==b)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
M - 汉字统计
知识点:
汉字内码(机内码)
(1)概念:在计算机内部表示汉字的代码。
(2)特点:汉字内码采用两个字节,一个汉字占两个ASCII字符;汉字内码最高位为1,ASCII码最高位为0
(3)汉字内码与区位码的关系:
汉字内码高位字节=(区号)16+(A0)16
汉字内码低位字节=(位号)16+(A0)16
例:汉字“啊”的区位码为1601,则其汉字内码为(B0A1)16。
所以,每个汉字都是小于0的。非汉字都是大于0的。而每个汉字占用两个字节,最后count1要除以二。
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char a[1005];
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
gets(a);
int count1=0;
for(int i=0;i<strlen(a);i++)
{
if(a[i]<0)
count1++;
}
printf("%d\n",count1/2);
}
return 0;
}
N - 进制转换
知识点:
进制转换和栈一样“先进后出”。
栈的基本操作:
头文件:#include
操作:
定义栈:stacks;
放入栈顶:s.push(item);
返回栈顶元素:s.top();//不会删除
删除栈顶元素:s.pop();//不会返回
返回栈中元素个数:s.size();
检查栈是否为空:s.empty();//为空返回true,否则返回false
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
stack<int>a;
int n,m,i;
while(~scanf("%d %d",&n,&m))
{
if(n<0)
{
n=-n;
printf("-");
}
while(n)//进制转换的过程
{
a.push(n%m);
n=n/m;
}
while(!a.empty())
{
i=a.top();//取栈顶元素
a.pop();//删除栈顶元素
char b;
if(i>9)
{
b=i-10+'A';
printf("%c",b);
}
else
printf("%d",i);
}
printf("\n");
}
return 0;
}
O - 杨辉三角
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int a[105][105];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
/* for(int i=0;i<n;i++)这一段是w了一次的,这是错误的。
{
a[i][0]=1;
for(int j=1;j<n;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}*/
for(int i=0;i<n;i++)
a[i][0]=1;
for(int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(int i=0;i<n;i++)
{
printf("%d",a[i][0]);
for(int j=1;j<=i;j++)
printf(" %d",a[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}
R - 人见人爱A^B
AC代码:
暴力解题法:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m)&&n&&m)
{
int sum=n;
for(int i=1;i<m;i++)
sum=(sum*n)%1000;
printf("%d\n",sum%1000);
}
return 0;
}
快速幂法:
知识点:
快速幂方法:就是先算a²,然后继续算(a²)²,一直算到n次幂。
模板一:
int fastpow(int a,int n)
{
if(n==1)
return a;
int temp=fastpow(a,n/2);//分治
if(n%2==1)//if(n&1)
return temp*temp*a;
else
return temp*temp;//偶数个a
}
模板二:
int fastpow(int a,int n)
{
int res=1;
while(n)
{
if(n&1)//如果N的最后一位是1,表示这个地方需要乘
res*=a;
a*=a;//推算乘积 a²--->(a²)²-->
n>>=1;//n右移一位,把刚处理过的n的最后一位去掉
}
return res;
}
与运算可以判断n是否为偶数,如果是偶数,返回0,否则返回1
快速幂取模:
int fastpow(int a,int n)
{
int res=1;
while(n)
{
if(n&1)//如果N的最后一位是1,表示这个地方需要乘
res=(res*a)%mod;
a=(a*a)%mod;//推算乘积 a²--->(a²)²-->
n>>=1;//n右移一位,把刚处理过的n的最后一位去掉
}
return res;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int fastpow(int a,int n)
{
int res=1;
while(n)
{
if(n&1)//如果N的最后一位是1,表示这个地方需要乘
res=(res*a)%1000;
a=(a*a)%1000;//推算乘积 a²--->(a²)²-->
n>>=1;//n右移一位,把刚处理过的n的最后一位去掉
}
return res;
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m)&&n&&m)
{
int t=fastpow(n,m);
printf("%d\n",t);
}
return 0;
}
不知道怎么又出现这个问题了?
S - Text Reverse
AC代码:
方法一:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
char a[1005];
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
gets(a);
int len=strlen(a);
for(int i=0;i<len;i++)
{
if(a[i]==' ')//遇到空格的时候
{
for(int j=i-1;;j--)
{
if(j==-1)//一个单词的时候
break;
if(a[j]==' ')//多个单词的时候
break;
printf("%c",a[j]);
}
printf(" ");
}
if(i==len-1)//最后一个单词
{
for(int j=len-1;;j--)
{
if(a[j]!=' ')
printf("%c",a[j]);
if(j==-1)//忽略了只有一个单词的时候
break;
if(a[j]==' ')
break;
}
printf("\n");
}
}
}
return 0;
}
方法二:
使用栈实现
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
int n;
char ch;
scanf("%d",&n);
getchar();
while(n--)
{
stack<char>s;
while(true)
{
ch=getchar();
if(ch==' '||ch=='\n'||ch=='\0')
{
while(!s.empty())
{
printf("%c",s.top());
s.pop();
}
if(ch=='\n'||ch=='\0')
break;
printf(" ");
}
else
s.push(ch);//入栈
}
printf("\n");
}
return 0;
}
总结:这些题目其实以前都已经做过了,但是再次来做的时候,发现还是有些不会。但是第二次来做的时候,会发现其他方法。从中学习到了新的知识点。