中北大学阿尔法编程之蛮力与分治算法

鸡兔脚数

有一群鸡和一群兔,他们的只数相同,它们的脚数都是三位数,且这两个三位数的各位数字只能是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;

}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值