第一题:
#include<stdio.h>
#include<string.h>
int main()
{
char str[105];
char ch;
int a[150]={0};
int prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
int i,n,x,max,min;
gets(str);
n=strlen(str);
for(i=0;i<n;i++)
{
ch=str[i];
a[ch]++;
}
max=a[97];
for(i=98;i<123;i++)
{
if(max<a[i]) max=a[i];
}
min=max;
for(i=98;i<123;i++)
{
if(a[i]==0) continue;
if(min>a[i]) min=a[i];
}
//printf("max = %d,min = %d",max,min);
x=max-min;
for(i=0;i<25;i++)
{
if(x==prime[i])
{
printf("Lucky Word\n%d",x);
return 0; //为什么这里的return 0;换成break;就不可以全对;求大佬解释
}
}
printf("No Answer\n0");
}
第二题:
快速排序算法,这里我提交后只有一个测试点通过
?代码如下,求大佬帮我优化一下
#include<stdio.h>
int array[1000001];
void quick_sort(int left, int right);
void quick_sort(int left, int right)
{
int i = left, j = right;
int temp; //中间变量元素,作为交换值
int pivot; //基准点元素
pivot = array[(left + right) / 2];
do
{
//从左到右找到大于等于基准点的元素
while (array[i] < pivot)
{
i++;
}
//从右到左找到小于等于基准点的元素
while (array[j] > pivot)
{
j--;
}
//如果 i<=j 则互换元素
if (i <= j)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
if (left < j)
{
quick_sort(left, j);
}
if (i < right)
{
quick_sort(i, right);
}
}while (i <= j);
}
int main()
{
int n, i;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &array[i]);
quick_sort(0, n - 1);
//printf("排序后的结果是:");
for (i = 0; i < n; i++)
{
printf("%d ", array[i]);
}
return 0;
}
第三题:
#include<stdio.h>
#include<math.h>
void wblj(int n);
int main()
{
int n;
scanf("%d",&n);
wblj(n);
return 0;
}
void wblj(int n)
{
int i;
for(i=15;i>=0;i--) //题目中最大数值20000,而2^15刚好大于20000
{
if(pow(2,i)<=n)
{
if(i==1) printf("2");
else if(i==0) printf("2(0)");
else
{
printf("2("); //递归
wblj(i);
printf(")");
}
n-=pow(2,i);
if(n!=0) printf("+");
}
}
}
?第四题:
这道题将数字以字符串的形式输入便于解题,使用strcmp函数将数字字符串进行比较,并且需要注意的是假如321?和 32 相比肯定是32在前面,因为32321>32132所以需要将两个相邻的字符串连接起来进行比较需要用到strcat函数?
?
?
#include<stdio.h>
#include<string.h>
int main()
{
char str[21][100];
char a[100], str1[200], str2[200]; //a是交换的中间变量
int n;
int i, j, k;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%s", str[i]);
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
k = i;
strcpy(str1, str[k]); //这里其实是比较 a+b 与 b+a 的大小
strcat(str1, str[j]);
strcpy(str2, str[j]);
strcat(str2,str[k]);
if (strcmp(str1, str2) < 0) k = j; //选择法排序
if (k != i)
{
strcpy(a, str[k]);
strcpy(str[k], str[i]);
strcpy(str[i], a);
}
}
}
for (i = 0; i < n; i++)
{
printf("%s", str[i]);
}
}
?
?
第五题:
?这道题看了很久才发现规律
第 n 行有 n 个数,并且当 n 为偶数时,分子从第一个数到第 n 个数,分别是1 到 n ,分母则相反,是从 n 到 1 ;
当 n 为奇数时,分子分母的情况与偶数相反,即分母从第一个数到第 n 个数,分别是1 到 n ,分子则相反,是从 n 到 1 ;
#include<stdio.h>
int main()
{
int n,h=1,k;
scanf("%d",&n);
while(n>h)
{
n-=h;
h++;
}
k=n-1; //计算这个数在第h行与该行第一个数相差几个数
if(h%2==0) printf("%d/%d",k+1,h-k);
else printf("%d/%d",h-k,k+1);
return 0;
}
这个while循环是用来判断第n个数在第几行,第一行一个数,第二行两个数,以此下去,所以从一开始让n开始减知道这个数小于该行
第六题:
如果不知道大写字母的ASCII就可以用这个字符直接减去'A'就可以了
#include<stdio.h>
#include<string.h>
int main()
{
int x=1,y=1;
int i,j;
char a[6],b[6];
scanf("%s",a);
getchar();
scanf("%s",b);
for(i=0;i<strlen(a);i++)
{
x*=(a[i]-'A'+1);
}
for(j=0;j<strlen(b);j++)
{
y*=(b[j]-'A'+1);
}
if(x%47==y%47) printf("GO");
else printf("STAY");
}
?第七题:
?应该先写一个判断质数的函数,每次循环就可以直接调用,然后从4开始循环到n,并且内循环只需要判断第一个加数,第二个用 i 减去,在判断它是否为指数即可。
#include<stdio.h>
#include<math.h>
int zhishu(int n)
{
int i,q;
q=(int)sqrt(n);
if(n==1) return 0;
for(i=2;i<=q;i++)
{
if(n%i==0) return 0;
}
return 1;
}
int main()
{
int n,i,j,t,k;
scanf("%d",&n);
for(i=4;i<=n;i+=2)
{
for(j=1;j<=i/2;j++)
{
t=j;
k=i-t;
if(zhishu(t)&&zhishu(k))
{
printf("%d=%d+%d\n",i,t,k);
break;
}
}
}
return 0;
}
第八题:
#include<stdio.h>
int main()
{
int a,b,day=0;
int max=8,i;
for(i=1;i<=7;i++)
{
scanf("%d %d",&a,&b);
if((a+b)>max)
{
max=a+b;
day=i;
}
}
printf("%d",day);
}
第九题:
?第 n 行数的第一个数和第 n 个数均为 1;即 a[i][0]和a[i][i]为 1 ,其他的 a[i][j]=a[i-1][j-1]+a[i-1][j]。
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i, j;
int a[20][20];
for (i = 0; i < n; i++)
{
a[i][0] = 1;
a[i][i] = 1;
for (j = 1; j < i; j++)
{
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
第十题:
#include<stdio.h>
int n,t[1001],i,ans;
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&ans);
t[ans]=1;
}
ans=0;
for(i=1;i<=1000;i++)
if(t[i])
ans++;
printf("%d\n",ans);
for(i=1;i<=1000;i++)
if(t[i])
printf("%d ",i);
return 0;
}
|