1、写一个函数找出一个整数数组中第二大的数。
PS1:66 66 66 //无第二大的数;
PS2:99 99 88 86、、第二大的数是88;
答案:
#include<stdio.h>
int findSecond(int a[],int length)
{
int i=0,j=0,temp=0;
for(i=0;i<length-1;i++)
{
for(j=i+1;j<length;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(i=1;i<length;i++)
{
if(a[i]<a[0])
return a[i];
}
printf("不存在第二大的数\n");
return -1;
}
int main(void)
{
int a[5]={8,1,1,8,1,};
int ret=findSecond(a,5);
printf("%d\n",ret);
return 0;
}
2、一辆卡车违反交通规则,撞人后逃跑。现场有三个人,都为记住车号。
甲说:前两位数字相同;
乙说:后两位数字相同,但与前两位不同;
丙说:四位车牌恰是一个整数的平方。
答案:
//首位不为0
#include<stdio.h>
int main(void)
{
int i=0,j=0,k=0,n=0;
for(i=1;i<10;i++)
for(j=0;j<10;j++)
{
if(i!=j)
{
k=i*1000+i*100+j*10+j;
for(n=34;n<100;n++)
{
if(k==(n*n))
{
printf("%d\n",k);
return 0;
}
}
}
}
return 0;
}
3、
What will print out why!
#include <stdio.h>
int main (void)
{
char *p1 = "name";
char *p2;
p2 = (char *)malloc(20);
meset(p2,0,20);
while(*p2++ = *p1++);
printf("%s\n", p2);
return 0;
}
答案:
输出为空,因为指针已经移动,不再指向首地址,而是指向’\0’。
4、如输入:Z2009-AShanghaiZ
则输出:lenth = 8;
事例说明:从A到Z的子串为SHanghai,其长度是8.
解:
#include<stdio.h>
#include<string.h>
int findlen(void)
{
int i,j;
char* p="Z2009-AshanghaiZ";
int len=strlen(p);
for(i=0;i<len;i++)
{
if(p[i]=='A')
break;
}
for(j=i+1;j<len;j++)
if(p[j]=='Z')
break;
return j-i-1;
}
int main(void)
{
int length=findlen();
printf("%d\n",length);
return 0;
}
5、下面是某语言的计算字符串Hash值的算法如下,如果字符‘a’、‘b’对应的ascii的值对应十进制是97、98,
请回答控制台打印出的数值是多少___
typedef unsigned long uintptr_t;
uintptr_t NXStrHash (const void *data)
{
uintptr_t hash = 0;
unsigned char *s = (unsigned char *)data;
if (s)for (; ; )
{
if (*s == '\0')break;
hash ^= (uintptr_t)*s++;
printf("1---%ld.\n", hash);
if (*s == '\0')break;
hash ^= (uintptr_t)*s++<<8;
printf("2---%ld.\n", hash);
if (*s == '\0')break;
hash ^= (uintptr_t)*s++<<16;
printf("3---%ld.\n", hash);
if (*s == '\0')break;
hash ^= (uintptr_t)*s++<<24;
printf("4---%ld.\n", hash);
}
return hash;
};
int main(void)
{
uintptr_t hash_value = NXStrHash("ab");
printf("%ld.\n", hash_value);
return 0;
}
解:
1---97.
2---25185.
25185.
{第一次hash为:01100001}
{第二次hash为:0110001001100001}
然后遇到0,跳出循环;返回0110001001100001;
(前面0省略,unsigned long为4字节32位)
6、实现整数n(n<=10)的算式:n!+(n-1)!+(n-2)!...+3!+2!+1!
输入 n = 3:结果3!+2!+1! =9
函数原型:int jiecheng_sum(int n)
答案:
#include<stdio.h>
int jiecheng_sum(int n)
{
int i=0;
int j=0;
int sum=0;
for(i=n;i>0;i--)
{
int mul=1;
for(j=i;j>0;j--)
{
mul=mul*j;
}
sum=mul+sum;
}
return sum;
}
int main(void)
{
int elemt;
printf("请输入n,0<n<=10\n");
scanf("%d",&elemt);
if(elemt<=0||elemt>10)
{
printf("输入错误\n");
return 0;
}
int ret=jiecheng_sum(elemt);
printf("%d\n",ret);
return 0;
}
7、给出三个正整数 a,b,c;在他们之间可以插入加号乘号或者括号将其变为表达式;
例如:
a+b*c
(a+b)*c
a*b*c
等表达式,你需要构造一个值最大的表达式,输出这个值。
输入 :第一行包括三个整数,0<=a,b,c<=10
输出:对应的答案;
例如:
输入 :1 2 3;
输出: 9;
#include<stdio.h>
int main(void)
{
int a=0,b=0,c=0,max=0,i=0;
int arr[6]={};
printf("第一行包括三个正整数a,b和c。1<a,b,c<10\n");
scanf("%d%d%d",&a,&b,&c);
arr[0]=a+b+c;
arr[1]=a*b*c;
arr[2]=a+b*c;
arr[3]=(a+b)*c;
arr[4]=a*b+c;
arr[5]=a*(b+c);
max=arr[0];
for(i=1;i<6;i++)
{
if(arr[i]>max)
max=arr[i];
}
printf("%d\n",max);
return 0;
}
8、一个数组有N个元素,使用冒泡排序对其进行排序输出;
输入描述:
输入一共两行;
第一行为,输入一个整数n,1<n<1000,表示一共有n个元素;
第二行为,n个数,即每个元素,每个整数都在32位int范围内,以空格分隔。
答案:
//虽然有警告,但是可以运行;
#include<stdio.h>
void maopao()
{
int n,i,j,temp;
printf("输入一个整数n,1<n<1000,表示数组一共有n个元素\n");
scanf("%d",&n);
int *p=(int *)malloc(n*sizeof(int));
printf("输入n个数,输入为一行,并且以空格隔开\n");
char * point=(char*)malloc(n*11*sizeof(char)); //申请一定区间存储字符串
setbuf(stdin,NULL);
gets(point);
for(i=0;i<n;i++)
{
int sum=0;
int flag=1;
while(*point==' ')
point++;
if(*point==0)
break;
if(*point=='-')
{
flag=-1;
point++;
}
while((*point>=48)&&(*point<=57))
{
sum=sum*10+(*point-'0');
point++;
}
sum=sum*flag;
p[i]=sum;
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(p[j]<p[j+1])
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
printf("输出为:\n");
for(i=0;i<n;i++)
printf(" %d",p[i]);
//free(p);
//free(point);
}
int main(void)
{
maopao();
return 0;
}