1. 输入一个位数小于100的整数,判断它是不是回文数
如12321是回文数,即个位与万位相同,十位与千位相同。如果是回文数,输出YES,如果不是回文数,输出NO。
题解:
- 小于0,一定不是回文数。
- 个位数,一定是回文数。
- 两位数,个位与十位相同是回文数,否则不是。
#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;
}