C语言编程题

1,最大公约数

//最大公约数
int a=4, b=12,temp;
while(a % b)
{
	temp = a%b;
	b = a;
	a = temp;
}
printf("%d\n" , b);

思路:

  • 求两数之间的最小值min
  • for循环min一次递减
  • if(两数是否都可以余i)

2,最小公倍数

//最小公倍数
int c = 4, d = 12,min,max;
 min = c < b ? c : d;
 max = c > b ? c : d;
 for (int i = 1; i <= min; i++)
 {
	 if ((max * i) % min == 0) {
		 printf("%d\n", max * i);
		 break;
	 }
 }

3,求n的所有素数因子

/*求n的所有素数因子(12的因子有1,2,3,6,12,但素数因子只有 2,3),*/
void prime(int k) {
	int i, j;
	for (i = 2; i <= k/2; i++) {
		if (k % i == 0)        //求所有因子
		{
			for (j = 2; j < i; j++) { //判断该因子是否为素数
				if (i % j == 0) break;
			}
			if (j == i)
			{
				printf("%5d", i);
			}
		}
	}
}

4,将整数字符串转成数值

#include <string.h>

int chnum(char* p) {
 
	int num = 0, k, len, j;
	len = strlen(p);
	for (;len!=0;p++)
	{
		k = *p - '0';      //将第一个字符转换成数字
		j = len-1;
		while (j > 0) {  //判断有几位数 k*(int)pow(10,j)
			k = k * 10;
            j--;
		}
		num = num + k;
	}
	return num;
}

5,判断子串substr在母串str中出现的次数

int count(char* str,char *substr) {

	int i, j, k, num = 0;
	for (i = 0; str[i] != '\0'; i++) 
		for (j=i,k=0;substr[k]==str[j];k++,j++)
			if (substr[k+1] == '\0') { num++; break; }
	return num;
	 

1,先遍历母串str

2,每次循环子串下标 初始值为0,并且j=i;

3,如果子串下一位的字符为‘\0’,num++; break;跳出循环

6,删除在a数组中全部删除k这个数字

void deleteNum(int a[],int n, int k) {
	int i, j,x=0;   //数组中有n个k
	for (i = 0; i < n; i++)   // 遍历a
	{
		if (k==a[i])   //在a数组中查找k
		{
			x++;	   //k的个数
			for (j = i; j < n-x; j++)  //从后面往前移动 最后一位为N-n
			{
				a[j] = a[j + 1];
			}
			i--;   //删除连续的k值
		}
		a[n-x] = 0;
	}
}

第六章

1,100以内的素数及素数的个数

 int main() {
	/*1,100以内的素数 */
	int i, j, flag,num=0;
	for ( i = 3; i < 100; i++)
	{
		flag = 1;     //*******************
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0) {
				flag = 0;
				break;
			}
		}
		if (flag != 0)
		{
			printf("%5d", i);//输出100以内的素数
			num++;
		}
	}
	printf("\n100以内的素数个数有%d\n", num);

2,用选择法进行排序(升序)

int a[10], i, j, n, temp;
	for (i = 0; i < 10; i++)
		a[i] = 10 - i;//scanf("%d", &a[i]);  输入数据
	for (i = 0; i < 10; i++)    // 0  N
	{
		n = i;
		for (j =i; j < 10; j++)   //j=i  N
		{
			if (a[n] > a[j]) 
				n = j;
		}
		if (n!=i)
		{
			temp = a[i];
			a[i] = a[n];
			a[n] = temp;
		}
	}//打印数组
	for (i = 0; i < 10; i++)
	{
		printf("%5d", a[i]);
		if ((i+1)%5==0)
			printf("\n");
	}

3,求二维数组a[3][3]的对角线的和

int a[3][3], i, j, s = 0,n=1;
	for (i = 0; i < 3; i++)     //给数组输入值
	{
		for (j = 0; j < 3; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			if (i == j)           //i==j
				s += a[i][j];
			if (i+j==2)           //j+i==N-1
			{
				s += a[i][j];
			}
		}
	}
	printf("sum=%d", s);

1, i==j

  1. j +i==N-1

4,在已排好序的数组中,插入一个数k,并且数组还是有序的

int a[N],i,j,k=6;
	for (i = 0; i < N-2; i++)  //输入数据到a[3]
	{
		a[i] = 10-i;
	}
//*****************************
	if (a[1] > a[0])  //判断数组 a是递增还是递减
		for (i = 0; a[i] < k; i++);//找出插入的下标
	else
		for (i = 0; a[i] > k; i++);
//**************************************
	for (j = N-2; j >= i; j--)//将插入下标后的全部后移
	{
		a[j + 1] = a[j];
	}
	a[j+1] = k; //************
	for (i = 0; i < N; i++) //输出a[3]
	{
		printf("%3d", a[i]);
		if ((i+1)%5==0)
		{
			printf("\n");
		}
	}

5,将数组倒序

int a[N],i,high=N-1,low=0,temp;
	for (i = 0; i < N; i++)
	{
		a[i] = i + 1; //scanf("%d",&a[i]);
	}
	while (low < high) {     //倒序排列方法一
		temp = a[low];
		a[low] = a[high];
		a[high] = temp;
		low++;
		high--;
	}
	for (i = 0; i < N; i++)
	{
		printf("%3d", a[i]);
	}
	printf("\n");

	for (i = 0; i < N/2; i++) {  //倒序排列方法二
		temp = a[i];
		a[i] = a[N-1-i];
		a[N - 1 - i] = temp;
	}
	for ( i = 0; i < N; i++)
	{
		printf("%3d", a[i]);
	}

6,杨辉三角

int a[10][10], i, j;
for (i = 0; i < 10; i++)            //0   N
{
	for (j = 0; j <= i; j++)        //0  j<=i
	{
		if (i == j || j == 0)       
			a[i][j] = 1;
		else 
			a[i][j] = a[i-1][j-1]+ a[i-1][j];
	}
}
	for (i = 0; i < 10; i++)          //打印二维数组
	{
		for (j = 0; j <=i; j++)      //***** j <=i;***********
			printf("%5d", a[i][j]);	
		printf("\n");
	}

7,求一个二维数组的鞍点(该行最大,该列最小 的地址(row,col))

int a[3][3], i, j,k,max,min, col=0,row=0,flag=0;
for ( i = 0; i < 3; i++) //给二维数组a输入值
{
	for (j = 0; j < 3; j++)
	{
		a[i][j] = i + j;
	}
}
a[0][2] = 1;
for (i = 0; i < 3; i++)
{
	//找出行中的最大值max及他的列数col
	max = a[i][0];
	for (j = 0; j < 3; j++)  
	{
		if (a[i][j] > max){
			max = a[i][j];
			col = j;
		}
	}
	//找出列中的最小值min及他的行数row
	for (k = 0; k < 3; k++)  
	{
		min = a[i][col];
		if (min>a[k][col])
		{
			min = a[k][col];
			row = k;
		}
	}
	if (i == row) {
		printf("a[3][3]的鞍点有:a[%2d][%2d]", i, k);	
		flag=1;
	}
}
if (flag==0)
{
	printf("该二维数组无鞍点!");
}

8,折半查找法在有序数组a中查找是否有输入的n有就输出他是第几个数,否则输出查无此数

int a[N], n,i,mid,high,low;
n = 0;
for (i = 0; i < N; i++)
	a[i] = i;
//scanf("%d", &n);

high = N-1;
low = 0;
while (low<=high)   
{
	mid = (high+low) / 2;
	if (n > a[mid]) low = mid + 1;
	else if (n < a[mid]) high = mid - 1;
	else break;
}
if (low>high)
	printf("查无此数!");
else 
	printf("%5d",mid+1);

思路:

看到折半应想到 high=N-1,low=0;while(high>=low){ mid=(high+low)/2; if…}

N=strlen(str);

9,有三行每行80个字符,统计每行字符中的空格,数字,大小写字母及其他字符的个数

char a[3][80];
int i,j,digit,big,small,space,el;
for (i = 0; i < 3; i++)
{
	gets_s(a[i]);
}
for (i = 0; i < 3; i++)
{
	j = 0,digit = 0, big = 0, small = 0, space = 0, el = 0;
	while (a[i][j]!='\0')
	{
		if (a[i][j] <= 'z' && a[i][j] >= 'a')
			small++;
		else if (a[i][j] <= 'Z' && a[i][j] >= 'A')
			big++;
		else if (a[i][j] <= '9' && a[i][j] >= '0')
			digit++;
		else if (a[i][j] == ' ')
			space++;
		else
			el++;
		j++;
	}
	printf("第%d行有big=%-5d,small=%-5d,space=%-5d,digit=%-5d,el=%-5d\n",
		i+1, big, small, space, digit,el);
}

思路:

可以直接双 for循环 边输入 边判断(for(i<3){ for(j<80) {if…} }

10,打印5x9的 平行四边形

int i, j,k;
for ( i = 0; i < 5; i++)
{
	for (j = 0; j < i; j++)
		printf(" ");
	for (k = 0; k < 5; k++)
		printf("*");
	printf("\n");
}

11,仿写一个strcat函数将b追加到a中

char a[20], b[20], * p1, * p2;
p1 = a,p2=b;
gets_s(a);
gets_s(b);

while (*p1 != '\0')  p1++;  //== for (; *p1 != '\0'; p1++);
while (*p2 != '\0') {
	*p1 = *p2;
	p1++;
	p2++;
}
*p1 = '\0';
p1 = a;
puts(a);

12,比较数组a,b的大小,返回相差的ascii值

char a[N]="abde", b[N]="abd", * p1, * p2;
p1 = a, p2 = b;
while (*p1==*p2)
{
	if (*p1=='\0')
	{
		printf("0");
		break;
	}
	p1++;
	p2++;
}
if(*p1 != *p2)
	printf("%d",*p1-*p2);

函数形式

int  mystrcmp(char* p1, char* p2) {
	while (*p1==*p2)
{
	if (*p1=='\0')  //那么得出p1,拍
	{
		return 0;
	}
	p1++;
	p2++;
}
	return *p1-*p2;
}

思路:先用while循环进行比较 while(*p1==*p2)

13,仿写一个strcpy函数

void mystrcpy(char* p1, char* p2) {
	while (*p2!='\0')
	{
		*p1 = *p2;
		p1++;
		p2++;
	}
	*p1 = '\0';
}

14, 破译密码 (a->z,A->Z )

void change(char* p) {
	while (*p!='\0')
	{
		if (*p>='a'&&*p<='z') //小写
		{
			*p = 27 - (*p - 96) + 96;
		}
		else if (*p >= 'A' && *p <= 'Z') {  //大写
			*p = 27 - (*p - 64) + 64;
		}
		p++;
	}
}

思路:假设a=1;z=26; 那么 a+反编译=27

更多推荐

专升本C语言必刷编程题