本文共 2152 字,大约阅读时间需要 7 分钟。
观察如下的算式:
9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
没有输入
输出一个整数。
提示把答案放在输出语句中输出,例如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/