博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝桥杯真题 17省Ja2-九数算式 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。 而乘积恰好也是用到了1~9的
阅读量:3961 次
发布时间:2019-05-24

本文共 2152 字,大约阅读时间需要 7 分钟。

问题描述

观察如下的算式:

9213 x 85674 = 789314562

左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。

而乘积恰好也是用到了1~9的所有数字,并且每个1次。

请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?

注意:

  1. 总数目包含题目给出的那个示例。
  2. 乘数和被乘数交换后作为同一方案来看待。
    输入

没有输入

输出

一个整数。

提示

把答案放在输出语句中输出,例如C/C++语言可以用printf或cout。

思路:

本题依然全排列:这里分享两种思路。

(一)将0-9一共10个数进行全排列,然后去判断0的位置,如果0不在边缘,就可以分割成两部分,记录0的位置,就可以将2个数字用循环就出来,然后进行判断就可以了。
(二)直接就1-9一共9个数的全排列,然后用一个循环控制乘号的位置,每遍历一次,就将这个遍历好的数字用这个循环试一遍(把乘号插入进数字中进行尝试)。然后也可以得到两个数字,之后就可以判断了。
这里要特别注意,最后的结果要除以2!!!!

思路一代码:

#include 
#include
#include
#define M 10using namespace std;int num = 0;int judge(int lift) //判断是否是一个组成自身的数字都不相等的数 {
int a[9]; int i,j; for(i=0;i<9;i++) {
a[i]=lift%10; lift/=10; } for(i=0;i<8;i++) {
for(j=i+1;j<9;j++) {
if(a[i]==a[j] || a[i]==0 || a[j]==0) //这个二重循环相当于一个冒泡排序,就是逐个比较,当有相等的或者等0的直接不合适 {
return 1; } } } return 0;}void disp(int *a, int n){
int i; int sign; int l=0,m=0; int lift1 = 0, lift2 = 0; for(i=0;i
=0;i--) {
lift1+=a[i]*pow(10,l++); } for(i=9;i>=sign+1;i--) {
lift2+=a[i]*pow(10,m++); } } int lift = lift1*lift2; if(lift>= 123456789 && judge(lift)==0) //进行判断,两个条件都要满足 {
num++; }}int main(){
int n=10; int a[]={
0,1,2,3,4,5,6,7,8,9}; do {
disp(a,n); } while (next_permutation(a,a+n)); printf("%d",num/2); //因为互换位置等于一种,所以结果要除以2,特别注意!!! return 0;}

思路二代码:(全排列过程都一样啦~)

#include 
#include
using namespace std;int num=0;//判断个位是否为0或与高位重复int dup(int z){
int n=z%10; //个位 if (n==0) //不能为0 return 1; while (z>10) {
z/=10; if ( z%10==n ) return 1; } return 0;}//判断条件,当z满足从1到9全不重复返回0,否则返回1int check(int z){
while (z>10) {
if ( dup(z)==1 ) return 1; z/=10; } return 0;}void p2(int *a,int i){
int j,x=0,y=0,z; for (j=0;j<=i;j++) x=x*10+a[j]; for (j=i+1;j<=8;j++) y=y*10+a[j]; z=x*y; if ( z>=123456789 && !check(z) ) {
num++; //printf("%d*%d=%d\n",x,y,z); }}void process(int *a){
int i; for (i=0;i<=7;i++) //i代表乘号分割位置 {
p2(a,i); }}int main(){
int n=9; int a[]={
1,2,3,4,5,6,7,8,9}; do {
process(a); } while (next_permutation(a,a+n)); printf("%d\n",num/2); return 0;}

转载地址:http://ysrzi.baihongyu.com/

你可能感兴趣的文章
如何查看进程的信息(线程数)
查看>>
Linux中的chage命令
查看>>
linux-详细解析密码文件passwd与shadow
查看>>
su- 与su的区别
查看>>
linux下发邮件mail
查看>>
echo如何手动输出换行
查看>>
身份证的正确使用方法——非常重要的知识
查看>>
ExtJS & Ajax
查看>>
Tomcat在Windows下的免安装配置
查看>>
JMeter常用测试元件
查看>>
JMeter——使用技巧
查看>>
Hibernate 实体层设计--Table per subclass
查看>>
JavaScriptHelper之 observe_field
查看>>
JavaScriptHelper之 periodically_ajax_tag
查看>>
Ruby on Rails(ROR) 小结(一) 绑定controller and view
查看>>
Ruby on Rails(ROR) 小结(一) 通过Schema Migrations来创建数据表
查看>>
form表单post请求发送及回收
查看>>
confluence5.8.10 安装与破解
查看>>
Testlink使用文档
查看>>
Ruby on Rails(ROR) 实例开发之一 配置数据库Mysql
查看>>