1.打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
#include<stdio.h>
int main()
{
int n=0,i=0,j=0,m=0,c=0,d=0,k;
char ch;
scanf("%d %c",&n,&ch);
int flag=1;
for(i=0;i<30;i++)
{
if((2*i*i-1)>n)
{
j=i-1;
k=j;
m=n-(2*(i-1)*(i-1)-1);
break;
}
}
for(c=0;c<j;c++){
for(d=0;d<c;d++){
printf(" ");
}
for(d=0;d<2*j-1-2*c;d++){
printf("%c",ch);
}
printf("\n");
}
for(c=0;c<j-1;c++){
for(d=0;d<j-2-c;d++){
printf(" ");
}
for(d=0;d<2*(c+1)+1;d++){
printf("%c",ch);
}
printf("\n");
}
printf("%d",m);
}
2.素数对猜想
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
#include<stdio.h>
#include<math.h>
int main(){
int i,j,m,n=0;
int count=0;
int arr[100000];
scanf("%d",&m);
for(i=2;i<=m;i++){
for(j=2;j<=sqrt(i);j++){
if(i%j==0){
break;
}
}
if(j>sqrt(i)){
arr[n]=i;
n++;
}
}
for(i=0;i<n-1;i++){
if((arr[i+1]-arr[i])==2){
count++;
}
}
printf("%d",count);
}
3.数组循环右移
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
#include<stdio.h>
int main(){
int i,m,n=0;
scanf("%d %d",&m,&n);
int arr[m],brr[m];
for(i=0;i<m;i++){
scanf("%d",&arr[i]);
brr[(i+n)%m]=arr[i];
}
if(n%m==0){
for(i=0;i<m-1;i++){
printf("%d ",arr[i]);
}
printf("%d",arr[m-1]);
}
else{
for(i=0;i<m-1;i++)
{
printf("%d ",brr[i]);
}
printf("%d",brr[m-1]);
}
}
挺久没写c语言的题了,真的生疏了很多,这三道题写了四十多分钟,其实都算简单题。4/5两道题明天应该会更新,第四题写了挺久,脑子不太想动啦。上面代码没有优化就直接贴上去了,有好的优化方法可以在评论区提出来啊。