例题:用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。
几点新知识(可能与题无关):
("%*.*f",m,n,x)//m->第一个*要取的整数位数;n->第二个*要取的小数位数,x->期望输入的数
int arr[n]
memset(arr,0,sizeof(n))//把arr[n]数组中的数字全部设为0
memcpy(b,a,sizeof(a))//把数组a全部复制到数组b中
if(x)//等效于if(x!=0)
if(!x)//等效于if(x==0)
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
for(int abc=123;abc<329;abc++)
{
int def=2*abc;
int ghi=3*abc;
int arr[11];
memset(arr,0,sizeof(arr));
unsigned int total=abc*1e6+def*1e3+ghi;
int i;
for(i=0;i<9;i++)
{
unsigned int temp=total;
for(int j=0;j<i;j++)
{
temp/=10;
}
temp=temp%10;
if(temp==0||arr[temp]) break;
else{
arr[temp]=temp;
}
if(i==8){
printf("%d %d %d\n",abc,def,ghi);
}
}
}
return 0;
}
接下来是对于例题的一个核心算法——即把一个数各个位数的数拆出来:
for(int i=0;i<9;i++)
{
unsigned int temp=total;
for(int j=0;j<i;j++)
{
temp/=10;//依次除以10^i倍
}
temp%10;//得到最后该i位的数
if(!temp||arr[temp]) break;//如果有0渗入或者如果一个数组用了2遍就跳出,因为初始化的时候每个数组都是0,所以一旦是未出现的,都是进入else语句中,出现过的就break了
else{
arr[temp]=temp;
}
}