鸡兔脚数
有一群鸡和一群兔,他们的只数相同,它们的脚数都是三位数,且这两个三位数的各位数字只能是0、1、2、3、4、5。设计一个算法用蛮力求鸡和兔的只数各是多少?它们的脚数各是多少?
#include<stdio.h>
void solve()
{
int a,b,c,d,e,f; int x1,x2,y,z;
for(a=1;a<=5;a++)
for(b=0;b<=5;b++)
for(c=0;c<=5;c++)
for(d=1;d<=5;d++)
for(e=0;e<=5;e++)
for(f=0;f<=5;f++)
{
y=a*100+b*10+c;//鸡脚数
z=d*100+e*10+f;//兔脚数
if(y%2!=0||z%4!=0)
continue;
x1=y/2;
x2=z/4;
if(x1==x2)
printf("鸡只数:%d,兔只数:%d,鸡脚数:%d,兔脚数:%d\n",x1,x2,y,z);
}
}
int main()
{
printf("求解结果\n");
solve();
return 0;
}
求解三位数
有一个三位数,个位数字比百位数字大,百位数字又比十位数字大,并且个位数字之和等于各位数字相乘之积,设计一个算法用穷举法求此三位数。
#include<stdio.h>
void solve()
{ int a,b,c;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
{ if(c>a&&a>b&&a+b+c==a*b*c)
printf("%d%d%d\n",a,b,c);
}
}
int main()
{ printf("结果为\n");
solve();
}
划船求人数
某年级的同学集体去公园划船,如果每只船坐10人,那么多出2个座位;如果每只船多坐2人,那么可少租1只船,设计一个算法用蛮力法求该年级的最多人数。
#include<stdio.h>
int solve ()
{
int x,y,z;
for (y=1;y<=100;y++)
{
for(z=0;z<12;z++)
{
if(10*y-2==12*(y-1)-z)
x=10*y-2;
}
}
return x;
}
int main()
{
printf("求解结果:\n");
printf("最多人数:%d\n",solve());
return 0;
}
求奇偶数个数
程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
#include<stdio.h>
int main(){
int n;
int i=0,j=0;
scanf("%d ",&n);
while(n!=-1){
if(n%2==1){
i++;
}else{
j++;
}
scanf("%d",&n);
}
printf("奇数个数为:%d 偶数个数为:%d",i,j);
return 0;
}
求车牌号
抓交通肇事犯。一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int a,b,c,d,m,n;
for (a=1;a<=9;a++)
{
m=10*a+a;
for (b=0;b<=9,b!=a;b++)
{
n=10*b+b;
for (c=32;c<=100;c++)
{
d=c*c;
if (d==m*100+n)
printf("车牌号为:%d \n",d);
}
}
}
return 0;
}
50先令求人数
马克思手稿中有这样一道趣味数学题:男人、女人和小孩总计30个人,在一家饭店里吃饭,共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,请用穷举法编程计算男人、女人和小孩各有几人,列出所有可能的组合。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int a,b,c;
printf("Man\tWomen\tChildren\n");
for (a=0;a<=30;a++)
{
for (b=0;b<=30;b++)
{
c=30-a-b;
if (c<=30&&c>=0&&a*3+b*2+c==50)
printf("%3d\t%5d\t%8d\n",a,b,c);
}
}
return 0;
}
1234组合不同三位数
编写程序,判断由1,2,3,4四个数字能组成多少个互不相同且无重复数字的三位数?输出这些数。每输出五个数换行。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int i,j,k,n=0;
for(i=1;j<5;i++)
for(j=1;j<5;j++)
for(k=1;k<5;k++)
if(i!=k&&i!=j&&j!=k)
{
printf("%d%d%d\t",i,j,k);
if(++n%5==0)printf("\n");
}
printf("\n共有:%d\n",n);
return 0;
}
搬砖问题
36块砖,36人搬。男搬4、女搬3、两个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int men,women,child;
for(men=0;men<=12;men++)
for(women=0;women<=12;women++)
{
child=36-men-women;
if(men*4+women*3+child*0.5==36)
printf("男:%d,女:%d,小孩:%d\n",men,women,child);
}
return 0;
}
渔民分鱼
有五个渔民一起出去捕鱼并决定睡觉起来分鱼。第一个人起来的比较早,将鱼分为五份并扔了一条多余的,然后拿走了自己那份。第二个人起来以为自己是最早起来的。于是也将鱼分为五份扔去多的一条鱼,拿走自己的那份。五个人都做了相同的事儿。请问最少有多条鱼?
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
for(int i = 1; ; i++){
int fish = i;
int flag = 1;
//模拟分鱼过程
for(int j =1; flag && j <= 5; j++){
if((fish - 1) % 5 == 0){
fish =( fish - 1 ) * 4 / 5;
}else{
flag = 0;
}
}
if(flag){
printf("共%d条鱼。\n",i);
break;
}
}
return 0;
}
猴子摘苹果
一只猴子采摘了一堆苹果,第一天吃一半的苹果,猴子觉得还不够,于是再吃了一个。第二天也是这样。一直到吃了九天,第十天就只剩下一个了。请问猴子一共采摘了多少苹果。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
for(int i = 1; ; i++){
//用一个保存假设的苹果个数
int apple = i;
//模拟猴子吃苹果的过程
for(int j = 1; j <= 9; j++){
apple = apple / 2 - 1;
}
//当第十天只剩下一个苹果的时候,i的值就是苹果的总个数
if(apple == 1){
printf("猴子一共采摘了%d颗苹果\n",i);
break;
}
}
return 0;
}
能被7或11整除不能同时被7和11整除的所有整数
找出1-1000之间能被7或11整除,但不能同时被7和11整除的所有整数。每输出10个数换行。
例子:7可以被7整除但不可以被11整除,符合条件。
#include <stdio.h>
int main()
{ int n,k=0;
for(n=1;n<1000;n++)
if(((n%7==0)||(n%11==0))&&(n%77!=0))
{ printf("%5d",n);
k++;
if(k%10==0)
printf("\n");}
return 0;
}
灯塔问题
有一座八层灯塔,每层的灯数都是其上一层的一倍,这座灯塔共有765盏灯,编程求出最上层和最下层的灯数。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int n = 1, m, sum, i;
while (1)
{
m = n;
sum = 0;
for (i = 1; i < 8; i++)
{
m = m * 2;
sum += m;
}
sum += n;
if (sum == 765)
{
printf ("第一层灯数为:%d\n",n);
printf ("顶层灯数为:%d\n",m);
break;
}
n++;
}
return 0;
}
最小公倍数
求两个数的最小公倍数。
最小公倍数:最小公倍数两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
例子:
4和5的最小公倍数为20。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int a=0;int b=0;
printf("请输入两个数(以空格隔开):");
scanf("%d %d",&a,&b);
int max=(a>b?a:b);//取最大值
while(max%a!=0||max%b!=0)//如果不能同时整除
{
max++;
}
printf("最小公倍数为%d",max);
return 0;
}
最大公约数
求两个数的最大公约数。
最大公约数:可以同时被两个数整除的最大的那个数就是最大公约数,比如说6和12,那么6可以同时被两个数整除,最大公约数不会超过两个整数中较小的一个。
例子:
20和16的最大公约数为4
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int a=0;int b=0;
printf("请输入两个数(以空格隔开):");
scanf("%d %d",&a,&b);
int min=(a<b?a:b);
while(a%min!=0||b%min!=0)//如果不能同时整除
{
min--;
}
printf("最大公约数为:%d",min);
return 0;
}
数和组合
有5个不同的数分别为:15、23、29、41和67。寻找所有组成1808的可能组合。每个数可用多次。
例子:
119*15+23=1808。
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代码
int sum = 0, count = 0;
for (int i15 = 0; i15 <= 1808 / 15; i15++)
{
for (int i23 = 0; i23 <= 1808 / 23; i23++)
{
if (i15 * 15 + i23 * 23 > 1808)
break;
for (int i29 = 0; i29 <= 1808 / 29; i29++)
{
if (i15 * 15 + i23 * 23 + i29 * 29 > 1808)
break;
for (int i41 = 0; i41 <= 1808 / 41; i41++)
{
if (i15 * 15 + i23 * 23 + i29 * 29 + i41 * 41 > 1808)
break;
for (int i67 = 0; i67 <= 1808 / 67; i67++)
{
sum = i15 * 15 + i23 * 23 + i29 * 29 + i41 * 41 + i67 * 67;
if (sum == 1808)
{
count++;
}
else if (sum > 1808)
break;
}
}
}
}
}
printf("一共有%d种组合\n", count);
return 0;
}
2进制中1的个数
输入一个整数n,输出该数32位二进制表示中1的个数。其中负数用补码表示。
例子:
10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010
其中有2个1,所以结果为2
#include<stdio.h>
int NumberOf1(unsigned int a)//把形参改成无符号整型,就对负数也适用了
{int count = 0; while (a)
{
if (a % 2 == 1)
{
count++;
}
a /= 2;
}
return count;
}
int main()
{
int a = 0;
printf("请输入一个整数:");
scanf("%d", &a);
int num = NumberOf1(a);
printf("这个整数中1的个数为:%d\n", num);
return 0;
}
求100-200的所有素数
素数又叫质数。素数,指的是“大于1的整数中,只能被1和这个数本身整除的数”。求100-200的所有素数。
例子:
101只能被1和101整除
#include<stdio.h>
#include <stdbool.h>
int main(){
//请在此处开始编写你的代
int i = 0;
int j = 0;
for (i = 101; i <= 200; i+=2)//从101开始判断100-200之间所有的奇数是否是素数
{
//判断i是否为素数
int chag = 1;//假设是素数
for (j = 2; j <= sqrt(i); j++)//利用这个循环依次取到2-i-1的所有整数
{
if (i % j == 0)
{
chag = 0;//如i % j!=0说明果不是素数,让chag=0,此时i是否为素数判断完毕,可以终止这个循环,判断下一个数字是否为素数
break;
}
}
if (chag == 1)
{
printf("%d ", i);
}
}
return 0;
}
百元买百鸡
我国古代的数学家张丘建在《算经》中提出的百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”其意为:“每只公鸡值五元,每只母鸡值三元,小鸡三只值一元。用一百元买一百只鸡,问公鸡、母鸡、小鸡各可以买多少只?”
#include <stdio.h>
#include <time.h>
const int N=100;
//问题的约束条件:百钱买百鸡,公鸡5元1只,母鸡3元1只,小鸡1元3只
int main()
{
//int start=clock();
int a,b,c;
for(a=0;a<=N;a++)//公鸡可能0-100只
for(b=0;b<=N;b++)//母鸡可能0-100只
for(c=0;c<=N;c++)//小鸡可能0-100只
{
if(a+b+c==N&&a*5+b*3+c/3==100&&c%3==0)//found 完善此处的判断条件使程序输出满足问题要求的组合
{
printf("公鸡%d只,",a);
printf("母鸡%d只,",b);
printf("小鸡%d只\n",c);
}
}
return 0;
}
求“水仙花数”
“水仙花数”是指一个三位数,其每位数字的立方和等于该数本身。
例子:
153是一个“水仙花数”,因为153=1*1*1+5*5*5+3*3*3。
编程找出 100-1000 以内的所有水仙花数。
#include<stdio.h>
int main(){
//请在此处开始编写你的代码
int i,j,k,n;
printf("100-1000的“水仙花数”有:\n");
for(i = 100;i < 1000;i++)
{
j = i%10;
k = i/10%10;
n = i/100;
if(j*j*j + k*k*k + n*n*n == i)
printf("%5d\n",i);
}
return 0;
}
找出自然数1-n中任取r个数的所有组合
找出从自然数1~n中任取r个数的所有组合。
例子:截至数3,2个数组合
自然数1~3中2个数的组合有:
1 2
1 3
2 3
注意:1 3,3 1被认为是同一种组合方案
#include <stdio.h>
#define MAX 100
int a[MAX];
void comb(int n, int r)
{ int i, j; i= 0;
a[i]= 1;
do{
if(a[i]-i<=n-r+1) //还可以向前试探
{
if(i==r-1) //找到一个组合
{
for(j=0; j<r; j++) //输出一个组合
printf("%4d", a[j]);
printf("\n");
a[i]++;
continue;
}
i++; //向前试探
a[i]= a[i-1]+1;
}
else
{
if(i==0) //找完全部解
return; //所有解都找到了才返回,结束函数
a[--i]++;
}
}while(1);
}
int main()
{
int x, y;
printf("请规定截止数和几个数组合(用,分割的整数):");
scanf("%d,%d",&x,&y);
printf("自然数1~%d中%d个数的任意组合有:\n", x, y);
comb(x, y);
return 0;
}
根据数字二进制下 1 的数目排序
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。
#include <stdio.h>
#include <stdlib.h>
// 计算一个整数的二进制表示中数字 1 的数量
int countBits(int num) {
int count = 0;
while (num > 0) {
count += num & 1;
num >>= 1;
}
return count;
}
// 比较两个整数的二进制表示中数字 1 的数目和数值大小
int compare(const void* a, const void* b) {
int numA = *(const int*)a;
int numB = *(const int*)b;
int countA = countBits(numA);
int countB = countBits(numB);
if (countA == countB) {
return numA - numB;
}
return countA - countB;
}
// 对整数数组按照二进制表示中数字 1 的数目和数值大小进行排序
void sortByBits(int arr[], int size) {
qsort(arr, size, sizeof(int), compare);
}
int main() {
int size;
// 从键盘输入数组大小
printf("请输入数组大小: ");
scanf("%d", &size);
int arr[size];
// 从键盘输入数组元素
printf("情输入数组元素: ", size);
for (int i = 0; i < size; ++i) {
scanf("%d", &arr[i]);
}
// 调用函数对数组按照二进制表示中数字 1 的数目和数值大小进行排序
sortByBits(arr, size);
// 输出排序后的数组
printf("排序后的数组为: ");
for (int i = 0; i < size; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
二分查找问题
给定一个有序数组arr[] 和一个目标值target,在数组中查找目标值,并返回其在数组中的索引位置。如果目标值不在数组中,则返回-1。
#include<stdio.h>
#pragma warning(disable: 4996) // 禁用对 scanf 的警告
int binary_search(int arr[], int low, int high, int target) {
if (low > high) {
return -1; // 目标值不在数组中
}
int mid = low + (high - low) / 2;
if (arr[mid] == target) {
return mid; // 找到目标值
}
else if (arr[mid] < target) {
return binary_search(arr, mid + 1, high, target); // 在右半边查找
}
else {
return binary_search(arr, low, mid - 1, target); // 在左半边查找
}
}
int main(){
//请在此处开始编写你的代码
int arr[5]; // 定义一个长度为5的数组
int i, target, result;
printf("请输入5个整数,以空格分隔:\n");
for (i = 0; i < 5; i++) {
scanf("%d", &arr[i]); // 使用scanf函数
}
printf("请输入要查找的目标值: ");
scanf("%d", &target); // 使用scanf函数
result = binary_search(arr, 0, 4, target);
if (result != -1) {
printf("目标值 %d 在数组中的索引位置为 %d\n", target, result);
}
else {
printf("目标值 %d 不在数组中\n", target);
}
return 0;
}
寻找数组中的最大值和最小值
给定一个整数数组,编写一个函数来找到数组中的最大值和最小值。
#include<stdio.h>
// 结构体用于同时返回最大值和最小值
struct MaxMin {
int max;
int min;
};
// 辅助函数:找到数组中的最大值和最小值
struct MaxMin find_max_min(int arr[], int low, int high) {
struct MaxMin result, left_res, right_res;
int mid;
// 如果数组只有一个元素,最大值和最小值都是该元素
if (low == high) {
result.max = arr[low];
result.min = arr[low];
return result;
}
// 如果数组只有两个元素,比较它们并返回最大值和最小值
if (high == low + 1) {
if (arr[low] > arr[high]) {
result.max = arr[low];
result.min = arr[high];
}
else {
result.max = arr[high];
result.min = arr[low];
}
return result;
}
// 如果数组有多个元素,递归地找到左右子数组的最大值和最小值
mid = (low + high) / 2;
left_res = find_max_min(arr, low, mid);
right_res = find_max_min(arr, mid + 1, high);
// 比较左右子数组的最大值和最小值,并返回整个数组的最大值和最小值
result.max = (left_res.max > right_res.max) ? left_res.max : right_res.max;
result.min = (left_res.min < right_res.min) ? left_res.min : right_res.min;
return result;
}
int main(){
//请在此处开始编写你的代码
int arr[6]; // 定义一个长度为6的数组
int size = sizeof(arr) / sizeof(arr[0]);
printf("请输入6个整数,以空格分隔:\n");
for (int i = 0; i < size; i++) {
scanf("%d", &arr[i]); // 使用scanf函数读取数组元素
}
struct MaxMin result = find_max_min(arr, 0, size - 1);
printf("数组中的最大值为: %d\n", result.max);
printf("数组中的最小值为: %d\n", result.min);
return 0;
}