C语言算法题

猴子吃桃

猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃一个,以后每天早上都吃了前一天剩下的一半零一个到底10天早上想再吃是,见只剩下一个桃子,求第一天共有多少桃子

方法一:逆向思维

#include<stdio.h>
#include <stdlib.h>
int main(){
	int n; //天数 
	int i;  //桃子数 
	int a = 1;
	scanf("%d",&n);
	for (i=1;i<=n;i++){
		a++;
		a*=2;
	} 
	printf("%d",a);
	return 0; 
}

方法二:递归方法

加密电文

有一类加密电文,按照下图的加密规则翻译成密码,要求实现把此类密码翻译回原文。 例如:密码abc456MNO翻译回原文为zyx543NML
A->Z,B->Y,C->X……M->N Z->A,Y->B……N->M 0->9,1->8,2->7……4->5
9->0,8->1……5->4 a->z,b->y,c->x……m->n z->a,y->b……n->m

自由落体

一球从M米高度自由下落,每次落地后返回原高度的一半,在落下, 他在第N次落下时反弹多高?共经过多少米?保留两位小数、

亲密数

求亲密数 如果一个数A的全部因子之和等于B且B的全部因子等于A 那么这两个数就互称为亲密数。因子:6的y因子为,1,2,3

#include<stdio.h>
#include<stdlib.h>
int main(){
	int a;//循环对象
	int b; //因子和 
	int i;//因子 
	int t; 
	printf("3000以内的亲密数:\n");
	for (a = 1; a <= 3000; a++){
		for (b = 0, i = 1; i <= a / 2; i++)//找因子
		{
			if (a%i == 0)
			{
				b += i;//整数a的因子之和
			}
	   }
		for (t = 0, i = 1; i <= b / 2; i++){
			if(b%i==0){
				t += i;
			}
		}
		if (t == a){
			printf("%d %d\n",a,b);
		}
}	  
	return 0;
}

5友捕鱼

一个人先醒,将鱼平分5份,正好多一条,然后扔进河里,拿了一份走了. 又一个人醒,将鱼平分5份,正好多一条,然后扔进河里,拿了一份走了. 类推
问:至少共捕几鱼

计算每个行和列元素的总和

/*
 * C program to read a matrix A (MxN) & find the following using
 * functions a) Sum of the elements of each row
 * b) Sum of the elements of each column
 * c) Find the sum of all the elements of the matrix
 * Output the computed results
 */
#include <stdio.h>
int Addrow(int array1[10][10], int k, int c);
int Addcol(int array1[10][10], int k, int r);
 
void main()
{
    int arr[10][10];
    int i, j, row, col, rowsum, colsum, sumall=0;
 
    printf("Enter the order of the matrix \n");
    scanf("%d %d", &row, &col);
    printf("Enter the elements of the matrix \n");
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    printf("Input matrix is \n");
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            printf("%3d", arr[i][j]);
        }
        printf("\n");
    }
    /*  computing row sum */
    for (i = 0; i < row; i++)
    {
        rowsum = Addrow(arr, i, col);
        printf("Sum of row %d = %d\n", i + 1, rowsum);
    }
    /*  computing col sum */
    for (j = 0; j < col; j++)
    {
        colsum = Addcol(arr, j, row);
        printf("Sum of column  %d = %d\n", j + 1, colsum);
    }
    /*  computation of all elements */
    for (j = 0; j < row; j++)
    {
        sumall = sumall + Addrow(arr, j, col);
    }
    printf("Sum of all elements of matrix = %d\n", sumall);
}
/*  Function to add each row */
int Addrow(int array1[10][10], int k, int c)
{
    int rsum = 0, i;
    for (i = 0; i < c; i++)
    {
        rsum = rsum + array1[k][i];
    }
    return(rsum);
}
/*  Function to add each column */
int Addcol(int array1[10][10], int k, int r)
{
    int csum = 0, j;
    for (j = 0; j < r; j++)
    {
        csum = csum + array1[j][k];
    }
    return(csum);
}

计算闰年

判断任意年份是否为闰年,需要满足以下条件中的任意一个:
① 该年份能被 4 整除同时不能被 100 整除;
② 该年份能被400整除。

#include <stdio.h>

void main(){
	int x;
	printf("输入:"); 
	scanf("%d",&x); 
	if(((x%4==0)&&(x%100!=0))||(x%400==0)){
		printf("%d 此年是闰年\n",x);
	}
	else{
		printf("%d 此年不是闰年\n",x);
	}
	main();
}

转二进制

#define N 100 

void main(){
	int n,a[N];
	int i = 0;
	printf("请输入:");
	scanf("%d",&n) ;
	while(n>0){
		a[i] = n % 2;
		i++;
		n/=2;
	}
	for(i--;i>=0;i--){
		printf("%d",a[i]);
		printf("\n");
	} 
}

异或运算实现两个数的交换

采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量:

a = a ^ b;
b = a ^ b;
a = a ^ b;

这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质:

1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0

2.任意一个变量X与0进行异或运算,结果不变,即X^0=X

3.异或运算具有可结合性,即abc=(ab)c=a(bc)

4.异或运算具有可交换性,即ab=ba

分析:

第一步: a = a ^ b;

完成后 a变量的结果为a ^ b

第二步: b = a ^ b;

此时赋值号右边的a保存的是a ^ b的值,那么将赋值号右边的a用a ^ b替换,

得到(a ^ b) ^ b=a ^ (b ^ b)=a ^0=a,

即经过第二步运算后b中的值为a,即b=a,将a换到了b里

第三步: a = a ^ b;

此时赋值号右边的a保存的仍然是a ^ b的值,不变,而赋值号右边的b已经是a 了,

将赋值号右边的a,b分别进行替换,

即此时赋值号右边a ^ b=(a ^ b)^ a=a ^ b^ a=a ^ a^ b=0^ b=b, 该值赋值给a,即a=b

即经过第三步运算后a中的值为b,即a=b,将b换到了a里

这样经过如上的三步骤,完成了交换两个变量a,b而无需借助第3个临时变量过程。

这个过程等价于如下的过程,:

a=a+b

b=a-b;

a=a-b;

前提是a+b的值不能溢出。

#include <stdio.h>
 
void main()
{
    long i, k;
 
    printf("Enter two integers \n");
    scanf("%ld %ld", &i, &k);
    printf("\n Before swapping i= %ld and k = %ld", i, k);
    i = i ^ k;
    k = i ^ k;
    i = i ^ k;
    printf("\n After swapping i= %ld and k = %ld", i, k);
}

以年数、周数和天数转换给定天数

#include <stdio.h>
#define DAYSINWEEK 7
 
void main()
{
    int ndays, year, week, days;
 
    printf("Enter the number of days\n");
    scanf("%d", &ndays);
    year = ndays / 365;
    week =(ndays % 365) / DAYSINWEEK;
    days =(ndays % 365) % DAYSINWEEK;
    printf ("%d is equivalent to %d years, %d weeks and %d daysn",
            ndays, year, week, days);
}

#include <stdio.h>
#include <math.h>
int main() {
	double m, y, r, i;
	scanf("%lf %lf %lf",&m,&y,&r);
	i=m*pow(1+r,y)-m;
	printf("interest = %.2lf\n",i);
	return 0;
}

Check if a String is a 回文数

#include <stdio.h>


 
void main()
{
    char string[50],re_string[50];
    int i,length = 0;
    int flag = 0;
    
    printf("please input a string:");
    gets(string);
    for(i=0;string[i]!=0;i++){
    	length++;
	}
	printf("The length of the string '%s' = %d\n", string, length);
	
	for(i = length-1;i>=0;i--){
		re_string[length-1-i] = string[i];
	}
	
	for(flag=1,i=0;i<length;i++){
		 if (re_string[i] != string[i]){
            flag = 0;
    }
}
    if (flag == 1)
       printf ("%s is a palindrome \n", string);
    else
       printf("%s is not a palindrome \n", string);
	
	main();
	
}

汉诺塔

#include <stdio.h>

void move(char x, char y)//把盘子从x柱移到y柱
{
	static int i = 0;//记录移动的次数
	i++;
	printf("第%d次把盘子从%c柱移到%c柱\n", i, x, y);
}
 
void Hanoi(int n,char A,char B,char C){
	if(n==1){
		move(A,C);
	}
	else if(n>1){
		Hanoi(n-1,A,C,B);//把A柱上n-1个盘子借助C柱移到B柱
		move(A, C);//A柱上n-1个盘子移到B上之后将A柱上第n个盘子移到C柱
		Hanoi(n - 1, B, A, C);//将B柱上n-1个盘子借助A柱移到C柱
	}
}
 
 
 
void main()
{
    int n =0;
    printf("input n:\n");
	scanf("%d", &n);
	char x = 'a';
	char y = 'b';
	char z = 'c';
	Hanoi(n, x, y, z);
	return 0;
	
}

判断字符串中的字符是否是大写字母,如果是,那么转换为小写字母。

#include<stdio.h>
int main()
{
    
	char ch;
	scanf("%c",&ch);
	ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
	printf("%c\n",ch);
	return 0;
}

编写摄氏温度

编写摄氏温度华氏温度转换程序。要求:从键盘输入一个摄氏温度,屏幕就显示对应的华氏温度,输出取两位小数。转换公式:F=(C+32)×9/5 。

#include<stdio.h>
void main()
{
	double C,F;
	printf("请输入:");
	scanf("%lf",&C) ;
	F = (C+32)*9.0/5.0;
	printf("F=%.2lf \n",F);

}

试编程判断输入的正整数

试编程判断输入的正整数是否既是5又是7的正倍数。若是,则输出yes;否则输出no。

#include<stdio.h>
void main()
{
	int x;
	scanf("%d",&x);
	if(x%5==0&&x%7==0)
	{
		printf("yes");
	}
	else
	{
		printf("no");
	}
}

判断数m是否为素数(只能被1和它本身整除的整数)?

#include <stdio.h>

int main(){
    int a=0;  // 素数的个数
    int num=0;  // 输入的整数

    printf("输入一个整数:");
    scanf("%d",&num);
    int i;

    for(i=2;i<num;i++){
        if(num%i==0){
            a++;  // 素数个数加1
        }
    }

    if(a==0){
        printf("%d是素数。\n", num);
    }else{
        printf("%d不是素数。\n", num);
    }

    return 0;
    
}

方法二

#include<stdio.h>
#include<math.h>
int main(){
	int x;
	int i;
	int k;
	printf("输入一个整数:");
    scanf("%d",&x);
    k=(int)sqrt( (double)x );
    for(i=2;i<=k;i++)
        if(x%i==0)
            break;
    // 如果完成所有循环,那么m为素数
    // 注意最后一次循环,会执行i++,此时 i=k+1,所以有i>k 
    if(i>k)
        printf("%d是素数。\n",x);
    else
        printf("%d不是素数。\n",x);
    return 0;

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值