0-1打印沙漏
这道题主要考察等差数列求和问题
思路:先求出上半三角一共有多少行,再根据等差数列求出最大行星星个数
从上到下遍历每一行,求出每一行星星个数。
输出时,空格个数=(最大行星星个数 - 该行星星个数)/2 (因为后面1/2空格不用输出)
代码如下:
#include <stdio.h>
// #include <cmath>
// using namespace std;
int main()
{
int num;
int row, rt, rm;
char symbol;
scanf("%d %c",&num,&symbol);
for(int i=0; i<501; i++)
{
if(i*i*2-1<=num && (i+1)*(i+1)*2-1>num)
{
row = i;
break;
}
}
rm = 2*row-1;
for(int i=row-1; i>-row; i--)
{
if(i<0)
{
rt = (-i+1)*2-1;
}
else rt = (i+1)*2-1;
for(int j=0; j<(rm-rt)/2; j++)printf(" ");
for(int k=0; k<rt; k++)
{
printf("%c",symbol);
}
printf("\n");
}
printf("%d", num-(row*row*2-1));
return 0;
}
0-2 素数对猜想
本道题考察循环和函数
思路:先写个判断素数的函数,再通过主函数遍历时调用,总体较为简单
PS:不要用数组,不仅会超限,而且蠢(XH看到这里你是不是含羞了)
代码如下:
#include<stdio.h>
#include<math.h>
int C[10010];
int IsPrime(int num)
{
int i;
int flag=1;
for(i=2;i<=sqrt(num);i++)
{
if(num%i==0)flag=0;
}
return flag;
}
int main()
{
int N;
int cnt=0;
scanf("%d",&N);
for(int i=5;i<=N;i++)
{
if(IsPrime(i) && IsPrime(i-2))cnt++;
}
printf("%d", cnt);
return 0;
}
0-3 数组元素循环右移问题
本题考查数组
思路:由于不让用两个数组,所以把数组先移动到后面,再把【n,n+num-1】的数组元素和【1,num-1】交换一下即可
要注意num>n的情况
代码如下:
#include<stdio.h>
#include<math.h>
int mov[210];
int main(){
int n,num,temp;
scanf("%d %d",&n,&num);
num=num%n;
for(int i=0;i<n;i++){
scanf("%d",&mov[i]);
}
for(int i=n-1;i>=0;i--){
mov[i+num]=mov[i];
}
for(int j=n;j<=n+num-1;j++){
temp=mov[j];
mov[j]=mov[j-n];
mov[j-n]=temp;
}
for(int i=0;i<n-1;i++) printf("%d ",mov[i]);
printf("%d",mov[n-1]);
return 0;
}
0-4 Have Fun with Numbers
本题考查模拟
思路:由于C不支持大数运算,所以用字符数组模拟大数。
按照乘法模拟即可,注意进位
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAXN 25
int a[10], b[10], N[MAXN], M[MAXN], len;
char tmp, str[MAXN];
int output(int flag,int M[MAXN])
{
if(flag)printf("Yes\n");
else printf("No\n");
if(M[0] > 0)printf("%d", M[0]);
for(int i = 1; i < len+1; i++)printf("%d", M[i]);
}
int main()
{
scanf("%s", str);
len = strlen(str);
for(int i = 0; i < len; i++)N[i] = str[i] - '0';
for(int j = 0; j < len; j++)a[N[j]]++;
int carry = 0;
for(int j = len-1; j>=0; j--)
{
M[j+1] = carry + N[j]*2 % 10;
carry = N[j]*2 / 10;
}
M[0] = carry;
int flag = 1;
if(M[0] > 0)flag = 0;
else
{
for(int j = 1; j < len+1; j++)b[M[j]]++;
for(int i = 0; i < 10; i++)
{
if(a[i] != b[i])
{
flag = 0;
break;
}
}
}
output(flag,M);
return 0;
}
0-5 Shuffling Machine
本题考查数组和模拟
思路:开三个数组模拟洗牌即可,大家可以试试用不同花色取模实现输出
(我比较懒就没有试)
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAXN 25
//using namespace std;
char *card_color[55]={"","S1","S2","S3","S4","S5","S6","S7","S8","S9","S10","S11","S12","S13"
,"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13"
,"C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12","C13"
,"D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D13"
,"J1","J2"};
int N;
int order[55],previous_order[55],set_order[55];
int main()
{
scanf("%d", &N);
for(int i=1;i<=54;i++)
{
scanf("%d",&set_order[i]);
previous_order[i] = i;
}
for(int step=1;step<=N;step++)
{
for(int i=1;i<=54;i++)
{
order[set_order[i]] = previous_order[i];
}
for(int i=1;i<=54;i++)
{
previous_order[i] = order[i];
}
}
for(int i=1;i<=54;i++)
{
if(i!=1)printf(" ");
printf(card_color[order[i]]);
}
return 0;
}