#把一个数把各个位数拆取出来

    xiaoxiao2022-07-07  171

    例题:用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; } }
    最新回复(0)