next_permutation为全排列函数,头文件为#include algorithm
举例:
标题: 马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
求解思路:
本题可以直接通过枚举暴力求解,当然也可以利用全排列的思想,首先将1-9全排列,取前5个数作为本题的a,b,c,d,e;但是会有432*1种重复,在最后除掉即可
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int ans = 0;
int main()
{
int num[] = {1,2,3,4,5,6,7,8,9};
do{
int a = num[0]*10 + num[1];
int b = num[2]*100 + num[3]*10 + num[4];
int a_2 = num[0]*100 + num[3]*10 + num[1];
int b_2 = num[2]*10 + num[4];
if (a*b == a_2*b_2)
{
ans++;
}
}while(next_permutation(num, num + 9));
cout<<ans/4/3/2/1<<endl;
}
蓝桥杯第四届题目第九题:标题:带分数
100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
也可以用到next_permutation先做一个全排列
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int num[] = {1,2,3,4,5,6,7,8,9};
int N,ans;
int a,b,c;
int getsum(int begin,int end)
{
int s = 0;
for(int i=begin;i<=end;i++)
{
s = s*10 + num[i];
}
return s;
}
void solve()
{
for(int i=0;i<8;i++)
{
a = getsum(0,i);
if(a>N)
continue;
for(int j=i+1;j<8;j++)
{
b = getsum(i+1,j);
c = getsum(j+1,8);
if(b>=c&&b%c==0&&(a+b/c==N))
ans++;
}
}
}
int main()
{
cin>>N; //输入N
do{
solve();
}while(next_permutation(num,num+9));
cout<<ans<<endl;
}