C语言练习(三) -----F0803 编程题 2020年

1. 输入一个位数小于100的整数,判断它是不是回文数

如12321是回文数,即个位与万位相同,十位与千位相同。如果是回文数,输出YES,如果不是回文数,输出NO。


题解:
  1. 小于0,一定不是回文数。
  2. 个位数,一定是回文数。
  3. 两位数,个位与十位相同是回文数,否则不是。
#include"stdio.h"

int _is_palindrom(int n){
	int i1,i2;
	if(n < 0)
		return 0;
	

	i1 = n/10;  //十位
	i2 = n%10;  //个位

	if(i1 == 0 || i1 == i2)
		return 1;
	else return 0;
}

int main(){
	int n;
	printf("输入整数:");
	scanf("%d",&n);
	if(_is_palindrom(n))
		printf("是回文数\n");
	else printf("不是回文数\n");
	return 0;
}

2. 输入两个正整数,找出这两个数的最大公约数

#include"stdio.h"

//1.0 穷举法,从大到小遍历
int direct_measure(int n1,int n2){
	int temp;
	temp = n1>n2 ? n2 : n1;
	for(; temp > 0; temp--){
		if(n1%temp==0&&n2%temp==0)
			return temp;
	}
	return 0;
}

//1.1 除法
int division_measure(int n1, int n2){
	int a,b,c;
	a=n1,b=n2;
	while(a%b!=0){
		c=a%b;
		a=b;
		b=c;
	}
	return b;
}

//1.2 减法
int subtract_measure(int n1, int n2){
	int a,b,c;
	a=n1,b=n2;
	while(a!=b){
		if(a>b)
			a -= b;
		else b -= a;
	}
	return b;
}
 
int main(){
	int n1,n2,outcome;
	printf("输入整数:");
	scanf("%d %d",&n1,&n2);
	//outcome = direct_measure(n1,n2);
	//outcome = division_measure(n1,n2);
	outcome = subtract_measure(n1,n2);
	if(outcome)
		printf("最小公公约数:%d\n",outcome);
	return 0;
}

2.2. 附加:找出这两个数的最小公倍数

#include"stdio.h"
//2.0 直接穷举
int direct_measure(int a,int b){
	int max = a>b?a:b;
	while(max%a!=0 || max%b!=0)
		max++;
	return max;
}
//2.1 累乘法
int multiply_measure(int a,int b){
	int i=1;
	while((a*i)%b!=0)
		i++;
	return (a*i);
}

//2.2 利用最大公约数
int division_measure(int a, int b,int max){   //已知max是最大公约数
	return a*b/max;
}


int main(){
	int a,b;
	printf("输入a,b:");
	scanf("%d %d",&a,&b);	
	
	printf("最小公倍数: %d",direct_measure(a,b));

	return 0;
}

3. 计算1+1/2+1/3+1/5+…+1/f(n)的值,其中f(n)是斐波那契数列的第n个值

#include"stdio.h"

//递归求斐波那契数列
int fab(int n){
	if(n==1)
		return 1;
	else if(n==2)
		return 2;
	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 n;
	for(n=1;n<=1000;n++){
		if(n%3==0 && n%5==0 && n%10!=0)
			printf("%d\n",n);
	}
	return 0;
}

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. 实现两个升序的数组的合并,合并后的数组依然是有序的

原型如下:

int* merge(int* data1, int* data2, int length1, int length2)
//data1 和 data2 为两个升序的数组
//length1 和 length2 为两个数组的长度

实现代码:
#include"stdio.h"
#include"stdlib.h"

int* merge(int a[],int b[],int length_a,int length_b){
	int i=0,j=0,k=0;
	int* arr = (int *) malloc(sizeof(int *)*(length_a+length_b));
	while(i<length_a && j<length_b){
		if(a[i]>b[j])
			arr[k++]=b[j++];
		else arr[k++]=a[i++];
	}
	while(i<length_a)
		arr[k++]=a[i++];
	while(j<length_b)
		arr[k++]=b[j++];
	return arr;
}

int main(){
	int a[] = { 2,5,8,9,12,35 },b[] = { 1,4,10,22,24};
	int length_a,length_b,i;
	int* arr;
	length_a = sizeof(a)/sizeof(int);
	length_b = sizeof(b)/sizeof(int);
	
	arr = merge(a,b,length_a,length_b);
	for(i=0;i<length_a+length_b;i++)
		printf("%d\n",arr[i]);
	return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值