文章目录
猴子吃桃
猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃一个,以后每天早上都吃了前一天剩下的一半零一个到底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;
}