【实验1-1】穷举法应用

换零钱:将5元的人民币兑换成1元、5角和1角的硬币,共有多少种不同的兑换方法?

思路:

  1. 将每种可能的条件一一遍历
  2. if:判断是否符合要求
void change() {
	float sum;
	cout << "请输入计算金额:";
	cin >> sum;

	float one = 1, Five_corners = 0.5, one_corners = 0.1;
	
	int count = 0;


	for (int a = 0; a <= 5; a++) {
		for (int b = 0; b <= 10; b++) {
			for (int c = 0; c <= 50; c++) {
				if (one * a + Five_corners * b + one_corners * c==sum) {
					count++;
				}
			}
		}
	}

	cout << "count=" << count;
}

 

找自守数:自守数是指一个数的平方的尾数等于该数自身的自然数。例如5×5=25,25×25=625,76×76=5776,9376×9376=87909376,求100000以内的自守数。

void Automorphic_number() {
	int num=1;//记录整数位数
	int nums = 0;//记录自守数个数

	int aim= 100000;
	for (int i = 1; i <= aim; i++) {
		//法一:求整数的位数 
		//num = 1 + (int)log10(i);  
		
		//法二:求整数的位数
		int a=i;//记录i,临时变量
		while (a / 10 != 0) {
			a /= 10;
			num++;
		}
		//计算自守数
		if ((i * i) % (int(pow(10,a))) == i) {//C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 x^y
			cout << "  " << i << "  ";
			nums++;
		}
	}
	cout <<endl<< "以上是100000以内的自守数,一共" << nums;
}

一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?

1.找对称数
//找对称数
bool Symmetrical_number(int num) {
	int oid_num = num;  //传入的数字
	int new_num = 0;    //颠倒后的数字
	while (num)          //当前num的位数大于1(值大于9)
	{
		//将new_num乘以10,然后加上num的个位数,
		//使个位数从原来的后第n位变成前第n位
		new_num = new_num * 10 + num % 10;
		num /= 10; //num除以10,将个位数去掉
	}
	if (new_num == oid_num) //如果反转后的数字和原数字相同
		return true;
	else 
		return false;
}

一下为总代码程序

#include<iostream>
#include<math.h>
using namespace std;


//找零钱
void change() {
	float sum;
	cout << "请输入计算金额:";
	cin >> sum;

	float one = 1, Five_corners = 0.5, one_corners = 0.1;
	
	int count = 0;


	for (int a = 0; a <= 5; a++) {
		for (int b = 0; b <= 10; b++) {
			for (int c = 0; c <= 50; c++) {
				if (one * a + Five_corners * b + one_corners * c==sum) {
					count++;
				}
			}
		}
	}

	cout << "count=" << count;
}

void Automorphic_number() {
	int num=1;//记录整数位数
	int nums = 0;//记录自守数个数

	int aim= 100000;
	for (int i = 1; i <= aim; i++) {
		//法一:求整数的位数 
		//num = 1 + (int)log10(i);  
		
		//法二:求整数的位数
		int a=i;//记录i,临时变量
		while (a / 10 != 0) {
			a /= 10;
			num++;
		}
		//计算自守数
		if ((i * i) % (int(pow(10,a))) == i) {//C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 x^y
			cout << "  " << i << "  ";
			nums++;
		}
	}
	cout <<endl<< "以上是100000以内的自守数,一共" << nums;
}

//找对称数
bool Symmetrical_number(int num) {
	int oid_num = num;  //传入的数字
	int new_num = 0;    //颠倒后的数字
	while (num)          //当前num的位数大于1(值大于9)
	{
		//将new_num乘以10,然后加上num的个位数,
		//使个位数从原来的后第n位变成前第n位
		new_num = new_num * 10 + num % 10;
		num /= 10; //num除以10,将个位数去掉
	}
	if (new_num == oid_num) //如果反转后的数字和原数字相同
		return true;
	else 
		return false;
}

void main() {
	//change();

	//Automorphic_number();

	int begin = 95859, destination = 0;
	float speed = 0.0f;
	while (begin++)
	{
		if (Symmetrical_number(begin)) {
			break;
		}
	}
	destination = begin;
	cout << destination;

	speed = (destination - 95859) / 2.0f;
	cout << "车的速度是" << speed;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值