1.输入一串字符(长度不超过100)和一个正整数k,将其中的英文字母加密并输出加密后的字符串,非英文字母不变。加密思想:将每个字母c加一个序数k,即用它后面的第k个字母代替,变换公式:c=c+k。如果字母为z,则后一个字母是a,也就是字母字符形成一个圆。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
int k;
char str[101];
gets(str);
scanf("%d",&k);
for(int i=0;str[i]!='\0';i++)
{
if(isalpha(str[i])){
int temp;
char base=isupper(str[i])?'A':'a';
temp=(((str[i]-base)+k)%26)+base;
str[i]=(char)temp;
}
}
puts(str);
}
2.计算两个矩阵A和B的乘积。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
int m,p,n;
scanf("%d%d%d",&m,&p,&n);
int A[m][p],B[p][n];
for(int i=0;i<m;i++){
for(int j=0;j<p;j++){
scanf("%d",&A[i][j]);
}
getchar();
}
for(int i=0;i<p;i++){
for(int j=0;j<n;j++){
scanf("%d",&B[i][j]);
}
getchar();
}
int C[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
C[i][j]=0;
for(int k=0;k<p;k++)
C[i][j]+=A[i][k]*B[k][j];
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
printf("%d ",C[i][j]);
printf("\n");
}
return 0;
}
3.输入一个字符串,判断其是否是C的合法标识符。C语言中规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char str[51];
gets(str);
if(str[0]=='_'||isalpha(str[0]));
else
{
printf("no\n");
return 0;
}
for(int i=0;str[i]!='\0';i++)
{
if(!(isalnum(str[i])||str[i]=='_'))
{
printf("no\n");
return 0;
}
}
printf("yes\n");
return 0;
}
4.计算机数据都是由0和1组成的,看着长长的0101001110101111011,要找出连续n个1的子串有多少个,确实麻烦,请你编程实现吧。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char str[1001];
gets(str);
int n;
scanf("%d",&n);
int len=0;
int count=0;
for(int i=0;str[i]!='\0';i++)
{
while(str[i]=='1')
{
len++;
i++;
if(len==n)
{
count++;
len=n-1; //代码核心
}
}
len=0;
}
printf("%d\n",count);
return 0;
}
5.英文字母里出现频率最高的是哪个字母呢? 给定一个字符串,输出字符串中出现次数最多的字母
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char str[101];
gets(str);
int hash[26]={0};
for(int i=0;str[i]!='\0';i++)
{
if(isalpha(str[i]))
{
char base=isupper(str[i])?'A':'a';
hash[str[i]-base]++;
}
}
int max=0;
for(int i=1;i<26;i++)
{
if(hash[i]>hash[max])
{
max=i;
}
}
printf("%c\n",'a'+max);
return 0;
}
6.输入n个数,每个数的进制由其后面的数字k指定,k>=2且k<=10, 输出最大的数对应的十进制数。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int KToD(char str[],int k)
{
int res=0;
for(int i=0;str[i]!='\0';i++)
{
res=res*k+str[i]-'0';
}
return res;
}
int main()
{
char str[101];
int n,k;
scanf("%d",&n);
int max=-1;
for(int i=0;i<n;i++)
{
scanf("%s%d",str,&k);
int temp=KToD(str,k);
if(temp>max)
{
max=temp;
}
}
printf("%d\n",max);
return 0;
}
7.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int q;
scanf("%d",&q);
long long res;
long long n;
int k;
for(int i=0; i<q; i++){
res=1;
n=0;
k=0;
scanf("%lld%d",&n,&k);
for(int j=2; j<=(int)sqrt(n);j++){
int coef=0;
while(n%j==0){
n/=j;
coef++;
}
if(coef>=k)
res*=pow(j,coef);
}
printf("%lld\n",res);
}
return 0;
}
8.n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。(约瑟环问题)
#include <stdio.h>
int findMonkeyKing(int n,int m){
int i,last = 0;
for(i=2;i<=n;i++){
last=(last+m)%i;
}
return last+1;
}
int main()
{
int n, m;
scanf("%d %d",&n,&m);
int monkeyKing=findMonkeyKing(n,m);
printf("%d\n",monkeyKing);
return 0;
}
9.读入一个实数,输出实数的整数部分。注意该实数的位数不超过100位。输入的整数部分可能含有不必要的前导0,输出时应去掉,当然,若整数部分为0,则该0不能去掉。如输入0023.56732,输出应为23,而不是0023;0.123对应的输出应为0。当然输入也可能不含小数部分。
要求定义并使用rounding()函数,原型如下:
char *rounding(char *p)
{
//将字符串p表示的实数取整后生成新的字符串,并由函数返回
}
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char* rounding(char* p){
static char result[101];
int i=0,j=0,hasNonZero=0;
while(p[i]=='0'&&p[i]!='.'&&p[i]!='\0')
i++;
while(p[i]!='\0'&&p[i]!='.')
{
result[j++]=p[i++];
hasNonZero=1;
}
if(!hasNonZero)
result[j++]='0';
result[j]='\0';
return result;
}
int main(){
char num[101];
scanf("%s",num);
char* integerPart=rounding(num);
printf("%s\n",integerPart);
return 0;
}
10.有n个整数,使前面各数顺序向后移动k个位置,移出的数再从开头移入。输出移动后的数组元素。
题目没有告诉你n的范围,希望你读入n之后用malloc()函数动态申请内存空间,不要提前定义数组的大小。不要偷懒哦。
另外要求定义并使用函数ringShift()
void ringShift(int *a, int n, int k)
{
//循环移动后的数值仍然存入数组a中
}
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
void ringShift(int *a, int n, int k)
{
int *b=malloc(sizeof(int)*n);
for(int i=0;i<n;i++)
b[(i+k)%n]=a[i];
for(int i=0;i<n;i++)
a[i]=b[i];
}
int main()
{
int n;
scanf("%d",&n);
int *a=malloc(sizeof(int)*n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int k;
scanf("%d",&k);
ringShift(a,n,k);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
11.输入一个字符串,由空格、英文字母、数字组成,以回车结束,长度小于1000。注意:010是两个数字,0和10
#include <stdio.h>
#include <string.h>
int main() {
char str[101];
gets(str);
int count=0;
for(int i=0;str[i]!='\0';i++)
{
if(str[i]=='0')
count++;
if(str[i]>='1'&&str[i]<='9')
{
while(str[i+1]!='\0'&&str[i+1]>='0'&&str[i+1]<='9')
i++;
count++;
}
}
printf("%d\n",count);
return 0;
}
12.给你一组数(未排序),请你设计一个程序:求出里面个数最多的数。并输出这个数的长度。
例如:给你的数是:1、 2、 3、 3、 4、 4、 5、 5、 5 、6, 其中只有6组数:1, 2, 3-3, 4-4, 5-5-5 and 6.
最长的是5那组,长度为3。所以输出3。
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main() {
int t;
scanf("%d",&t);
int n;
for(int i=0;i<t;i++)
{
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(int),cmp);
int pre=a[0],len=0,max=0;
for(int i=1;i<n;i++)
{
if(a[i]==pre)
{
len++;
}
else{
pre=a[i];
if(len>max)
{
max=len;
}
len=0;
}
}
if(len>max)
max=len;
printf("%d\n",max+1);
}
return 0;
}
13.找出一个2×3的整数矩阵中的最大值及其行下标和列下标,要求调用函数FindMax(int p[][3], int m, int n, int *pRow, int *pCol)实现,行下标和列下标在形参中以指针的形式返回。
void FindMax(int p[][3], int m, int n, int *pRow, int *pCol){
//在m*n矩阵p中查找最大值,将其行下标存入pRow所指内存单元,将其列下标存入pCol所指内存单元
}
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
void FindMax(int p[][3], int m, int n, int *pRow, int *pCol){
int max=p[0][0];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(p[i][j]>max)
{
max=p[i][j];
*pRow=i;
*pCol=j;
}
}
}
}
int main()
{
int p[2][3];
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
scanf("%d",&p[i][j]);
int pRow=0,pCol=0;
FindMax(p,2,3,&pRow,&pCol);
printf("%d %d %d",p[pRow][pCol],pRow,pCol);
}
14.小明希望能把其余重复的数去掉,然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(int),cmp);
for(int i=1;i<n;i++)
{
if(a[i]==a[i-1])
{
for(int j=i;j<n;j++)
{
a[j]=a[j+1];
}
n--;
i--;
}
}
printf("%d\n",n);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
15.输入含有一些数据组,每组数据包括菜种(不含空格的字串),数量w(计量单位不论,一律为double型数)和单价p(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价啊。菜种、数量和单价之间都有空格隔开的。试试 while( scanf("%*s%lf%lf", &w,&p) != EOF ){ }
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
double w,p,res=0;
while(scanf("%*s%lf%lf",&w,&p)!=EOF)
{
res+=w*p;
}
printf("%.1f\n",res);
return 0;
}