C语言程序设计编程题(一)20

1、输入一个位数小于100的整数,判断它是不是回文,是输出yes,不是输出no。

#include<stdio.h>
#include<string.h>
int main()
{
 int l,t,i,m=0;
 char str[100];
 scanf("%s",str); 
 l=strlen(str);
 if (l%2==0) t=l/2-1;
 else t=l/2-1;
 for (i=0;i<=t;i++)
 if (str[i]!=str[l-i-1]) m=1;
 if (m==0) printf("Yes");
 else printf("No");
 return 0;
} 

2、写一个程序,输出两个正整数,找出这两个数的最大公约数

#include<stdio.h>
int main()
{
	int a = 0, b = 0, c = 0;
	printf("请输入两个正整数:>");
	scanf("%d %d", &a, &b);
	c = (a > b) ? b : a;             //将a、b中较小的值赋给c
	while ((a % c != 0) || (b % c != 0))    //求最大公约数   
	{
		c--;
	}
	printf("最大公约数是:%d\n", c);
	return 0;
}

3、编程计算1+1/2+1/3+1/5+…+1/f(n)的值,其中n是键盘输入,f(n)为斐波那契数第n个值。

#include"stdio.h"

//递归求斐波那契数列
int fab(int n){
	if(n==1||n==2)
		return 1;
	else return fab(n-1)+fab(n-2);
}

double _add(int n){
	int i=1;
	double total,sum;
	total = 0,sum=0;
	while(i<=n){
		total = 1.0/fab(i);
		sum += total;
		i++;
	}
	return sum;
}

int main(){
	int n;
	printf("输入n:");
	scanf("%d",&n);
	printf("%lf\n",_add(n));
	return 0;
}

4、输出1到1000之间,同时能被3和5不能被10整除的数。

#include<stdio.h>
int main()
{
    int i;
    for(i=100; i<1000; i++) // 从100到1000循环寻找满足条件的数
    {
        if(!(i%3) && !(i%5)&&(i%10))  // 如果该数能被3和5整除并且不能被10整除,则输出该数
            printf("%d ", i);  // 输出满足条件的数
    }
}

5、 输入一个长度不超过100的字符串,输出出现次数最多和最少的字符,出现次数相同时,输出第一次出现的字符

#include"stdio.h"
#define MIN 100
void count(char str[],int num[]){
	int i=0;
	while(str[i]!='\0'){
		num[(int)str[i]]++;
		i++;
	}
}
int find_max(int num[]){
	int max,i,sub;
	max=0;
	for(i=0;i<256;i++){
		if(max<num[i]){
			max = num[i];
			sub=i;
		}
	}
	return sub;
}

int find_min(int num[]){
	int min,i,sub;
	min=MIN;
	for(i=0;i<256;i++){
		if(num[i]>0 && num[i]<min){
			min = num[i];
			sub=i;
		}
	}
	return sub;
}

int main(){

	char str[100];
	int num[256]={0};  //统计字符个数
	gets(str);
	count(str,num);
	printf("最多字符:%c\n",find_max(num));
	printf("最少字符:%c\n",find_min(num));

	return 0;
}

6、实现两个升序的数组合并,合并后数组仍然有序。

#include <stdio.h>

void MergeArr(int* a, int alen, int* b, int blen, int* c, int clen)
{
	int i = 0;
	int j = 0;
	int k = 0;
	while (i != alen && j != blen)
	{
		if (a[i] < b[j])
			c[k++] = a[i++];
		else
			c[k++] = b[j++];	
	}
	if (i == alen)
	{
		while (j != blen)
		c[k++] = b[j++];
	}
	else
	{
		while (i != alen)
			c[k++] = a[i++];
	}
}

int main()
{
	int a[4] = { 2,4,5,9 };
	int b[4] = { 1,6,7,8 };
	int c[8] = { 0 };
	MergeArr(a, 4, b, 4, c, 8);
	for (int i = 0; i < 8; i++)
	{
		printf("%d\t", c[i]);
	}
	return 0;
}

1、输入2个正整数m和n(1<=m,n<=1000),输出m和n之间所有满足各位数字的立方和等于它本身的数。(水仙花数)例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

#include<stdio.h> 
int main()
{
	int m,n,i,j;
	scanf("%d %d",&m,&n);
	if(m<1||m>1000||n<1||n>1000){
            
		return 0;
	}
    for(i=m;i<n;i++)
    {   
    	int x,y,z;
        x=i%10;
        y=i/10%10;
        z=i/100%10;
        if(i==(x*x*x+y*y*y+z*z*z))
        printf("%d\n",i);
        
    }
    return 0;
}

2、编写一个程序,找出最大素数,素数只能被1和自身除尽的数。

#include<stdio.h>
#include<math.h>
int main(){      
	int x,i,j;
	printf("请输入取值范围:");
	scanf("%d",&x);
	for(i=x;i>1;i--){    
		for(j=2;j<=sqrt(x);j++){
            
			if(i%j==0){
            
				break;
			}
			if(j>sqrt(x)-1){
            
				printf("范围内最大素数为%d",i);
				return 0;
			}
		}
	} 
	return 0;
}

3、编写程序计算1!+2!+3!+……+n!的值,其中n是键盘输入。

#include<stdio.h>
int main(){
            
	int i,j,n;
	int sum=1,total=0;
	printf("请输入一个数n:");
	scanf("%d",&n);
	for (i=1;i<=n;i++){
            
		sum = 1;
		for (j=1;j<=i;j++){
            
			sum *= j;
		}
		total += sum;
	}
	printf("%d",total);
	return 0;
}

4、编写一个程序,输入一个长度不超过100的字符串,并删除字符串中重复的字符。

#include<stdio.h>    
#include<string.h>    
#define N 200    
int main()    
{    
char a[N];    
int i,j,n;    
char k;    
gets(a);   
int f=strlen(a);  
for(i=0;i<strlen(a);i++)  
     {for(n=0;n<i;n++)  
       if(a[i]==a[n])  
           {  
                 {for(j=i;j<f;j++)  
                    a[j]=a[j+1];  
                 }  i=i-1;
           }
		}   
puts(a);    
return 0;    
}  

5、假设一整箱数组存在若干正数和负数,现在通过某种算法使得数组的所有负数在正数的左边,且保证 负数和正数间元素相对位置不变,时间复杂度要求分为o(n),空间复杂度要求为o(1),不能使用辅助数组
分析:快排思想。两个指针分别从头和尾开始遍历直到两者交错,途中不满足的停下来交换。

#include<stdio.h>
void insertSort(int*A ,int size)
{ 
    int minus=-1,plus=-1;
    int tmp=0;
    for(int i=0;i<size;i++)
    {
        if(minus==-1)
        {
            if(A[i]<0&& plus>=0)
            {
                minus=i;
            }
            
            if(A[i]>0&& plus<0)
            {
                plus=i;
            }
        }

        if(minus>=0&& plus>=0)
        {
            tmp=A[plus];
            A[plus++] = A[minus];
            for (int k = minus; k> plus; k--) 
            {
                 A[k] = A[k -1];
            }
            A[plus]=tmp;
            minus=-1;
        }
    }
}
int main() {
    
    int A[]={2,1,-2,12,4,-2,-4,-6 };
    int size=sizeof(A)/sizeof(int);
    for(int i=0;i<size;i++)
    {
        printf("%d\t",A[i]);
    }
    printf("\n");
    insertSort(A,size);
    for(int i=0;i<size;i++)
    {
        printf("%d\t",A[i]);
    
	}
}

6、给定一个存放正数的数组,重新排列数组使得数组左边为奇数,右边为偶数,且保证奇数和偶数之间元素相对位置不变。时空复杂度要求分别为:o(n)和o(1)。

#include<stdio.h>
void insertSort1(int*A ,int size)
{ 
    int minus=-1,plus=-1;
    int tmp=0;
    for(int i=0;i<size;i++)
    {
        if(minus==-1)
        {
            if(A[i]%2!=0&& plus>=0)
            {
                minus=i;
            }
            
            if(A[i]%2==0&& plus<0)
            {
                plus=i;
            }
        }

        if(minus>=0&& plus>=0)
        {
            tmp=A[plus];
            A[plus++] = A[minus];
            for (int k = minus; k> plus; k--) 
            {
                 A[k] = A[k -1];
            }
            A[plus]=tmp;
            minus=-1;
        }
    }
}
int main() {
    int B[]={1,3,4,5,6 ,9};
    int s=sizeof(B)/sizeof(int);
    for(int i=0;i<s;i++)
    {
        printf("%d\t",B[i]);
    }
    printf("\n");
    insertSort1(B,s);
    for(int i=0;i<s;i++)
    {
        printf("%d\t",B[i]);
    }
     
    getchar();
    return 0;
} 

版权声明:本文为daisyxyr原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。