一些小的程序趣味算法题

分享一系列有趣的程序题,包括理解题意的关键和如何利用ASCII码值进行循环判断的技巧。

找了一些程序题,分享给大家

1. 
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 
A选手说:B第二,我第三; 
B选手说:我第二,E第四; 
C选手说:我第一,D第二; 
D选手说:C最后,我第三; 
E选手说:我第四,A第一; 
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。 
#include<stdio.h>
void BiSai(int A, int B, int C, int D, int E)
{
	for (A = 1; A <= 5; ++A)
	{
		for (B = 1; B <= 5; ++B)
		{
			for (C = 1; C <= 5; ++C)
			{
				for (D = 1; D <= 5; ++D)
				{
					for (E = 1; E <= 5; ++E)
					{		
						if ((B == 2) + (A == 3) == 1 &&
							(B == 2) + (E == 4) == 1 &&
							(C == 1) + (D == 2) == 1 &&
							(C == 5) + (D == 3) == 1 &&
							(E == 4) + (A == 1) == 1)
						{
							if (A*B*C*D*E == 120)
							{
								printf("A是第%d名\n", A);
								printf("B是第%d名\n", B);
								printf("C是第%d名\n", C);
								printf("D是第%d名\n", D);
								printf("E是第%d名\n", E);
							}
						}
					}
				}
			}
		}
	}
}

int main()
{
	int A = 0;
	int B = 0;
	int C = 0;
	int D = 0;
	int E = 0;
	BiSai(A, B, C, D, E);
	return 0;
}

这题主要理解题意就好,当时我也很懵逼。不做赘述。理解就好。

2. 
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个。 
嫌疑犯的一个。以下为4个嫌疑犯的供词。 
A说:不是我。 
B说:是C。 
C说:是D。 
D说:C在胡说 
已知3个人说了真话,1个人说的是假话。 
现在请根据这些信息,写一个程序来确定到底谁是凶手。 
int main()
{
	int k = 0;
	for (k = 'A'; k <= 'D'; k++)
	{
		if ((k != 'A') + (k == 'C') + (k == 'D') + (k != 'D') == 3)
		{
			printf("k=%c\n", k);
			return 0;
		}
	}
	return 1;
}

这个题主要就是那个循坏的搭建,直接用ASCII码值进行循环,在内循环中满足条件即可。不做赘述。

3. 
有一个字符数组的内容为:"student a am i", 
请你将数组的内容改为"i am a student". 
要求: 
不能使用库函数。 
只能开辟有限个空间(空间个数和字符串的长度无关)。 
static int my_strlen(const char *str)//实现strlen函数,确定字符产有多大
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
static void reverse_arr(char *left, char *right)//逆置字符串函数
{
	while (left < right)
	{
		char temp = *right;
		*right = *left;
		*left = temp;
		left++;
		right--;
	}
}
void reverse(char *str)//在逆置函数之后在设定空格以及‘/0’处在逆置
{
	assert(str != NULL);
	char *left = str;
	char *right = str + my_strlen(str) - 1;
	char *cur = str;
	reverse_arr(left, right);
	while (*cur)
	{
		char *start = cur;
		while ((*cur != ' ') && (*cur != '\0'))
		{
			cur++;
		}

		reverse_arr(start, cur - 1);
		if (*cur == ' ')
		{
			cur++;
		}
	}
}

int main()
{
	char arr[] = "student a am i";
	reverse(arr);
	printf("%s\n", arr);
	return 0;
}
2.喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,
给20元,可以多少汽水。
编程实现。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int num(int n)
{
	if (n == 0)
	{
		return 0;
	}
	if (n == 1)
	{
		return 1;

	}
	if (n % 2 == 0)
	{
		return n + num(n / 2);
	}
	else
	{
		return (n - 1) + num((n / 2) + 1);
	}
}

int main()
{
	int n = 0;
	printf("请问你要花费多少钱?\n");
	scanf("%d", &n);
	printf("%d元可以喝%d瓶汽水!!\n", n, num(n));
	system("pause");
	return 0;
}
4.1.求出0999999之间的所有“水仙花数”并输出。 
“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身, 
如;1531^35^33^3?,则153是一个“水仙花数”。 

1234=1^4 + 2^4 + 3^4 +4^4 

/* 
在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、 
阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数, 
其各个数之N次方和等于该数。 
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数: 
153 = 1^3 + 5^3 + 3^3。 
370 = 3^3 + 7^3 + 0^3。 
371 = 3^3 + 7^3 + 1^3。 
407 = 4^3 + 0^3 + 7^3。 

1234 = 1^4+2^4+3^4+4^4 
*/ 
int main()
{
int n;

int a[10] = { 0 };
int i;
int sum = 0;
int count = 0;
for (n = 0; n < 100000;++n)
{
	for (i = n; i; i = i / 10)
	{
		a[count] = i % 10;//存放每一位数字
		++count;//存放位数
	}
	for (i = 0; i < count; ++i)
	{
		sum += pow(a[i], count);
	}
	if (n == sum)
	{
		printf("%d \n", n);
	}
	count = sum = 0;
}
return 0;
}


任意数范围的水仙花数
#include<stdlib.h>
#include<math.h>
int main()
{
int k;
printf("请输入一个数:");
scanf("%d", &k);
int n;
int a[10] = { 0 };
int i;
int sum = 0;
int count = 0;
for (n = 0; n < k;++n)
{
	for (i = n; i; i = i / 10)
	{
		a[count] = i % 10;
		++count;
	}
	for (i = 0; i < count; ++i)
	{
		sum += pow(a[i], count);
	}
	if (n == sum)
	{
		printf("%d \n", n);
	}
	count = sum = 0;
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值