p; cin>>n;
i=0;
while (i<n)
{
x=rand()%1000+1;
if (flag[x]==0)
{
a[i++]=x;
flag[x]=1;
}
}
cout<<"随机产生的"<<n<<"个整数如下:"<<endl;
for (i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
for (i=0;i<=2000;i++)
flag[i]=0;
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
flag[a[i]+a[j]]=1;
cnt=0;
for (i=0;i<n;i++)
if (flag[a[i]]==1) cnt++;
cout<<"Count="<<cnt<<endl;
return 0;
}
【例5】神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。比如:210× 6 = 1260,8 × 473 = 3784,27×81 = 2187都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么一共有多少种满足要求的算式呢?
(1)编程思路。
采用穷举法来解决。穷举对象分别为积和那个较小的乘数。其中积是一个4位数,取值范围为1023~9876,乘数的取值范围为2~98。
循环体中需要检测两个约束条件:1)积这个4位数中每一位数字不允许重复;2)这4个数字出现且仅出现2次。这些约束条件可使用一个标记数组used[10]来处理。used数组的初值全为0,当数字i使用后,置used[i]=1,若数字i再次使用时,此时used[i]又等于1,则可判定约束条件不满足。
(2)源程序及运行结果。
#include <iostream>
using namespace std;
int check(int x, int y,int used[10])
{
int i,tmp[10]={0};
do {
tmp[x % 10]++;
} while(x /= 10);
do {
tmp[y % 10]++;
} while(y /= 10);
for (i=0;i<10;i++)
if (tmp[i]!=used[i])
&n