編程時遇到了一個問題,strtol返回值上限居然是2^32-1,用他的返回值求和根本做無用功,我就重新寫了個strtol_adv函數(返回值為long long,上限2^64-1)。 /* 1406357289 是由 0 ~ 9 的數字所組成的 pandigital 數, 如果 d1 表示第 1 個數字,d2 表示第 2 個數字,以此類推,發現有下列的性質: d2d3d4=406 可以被 2 整除 d3d4d5=063 可以被 3 整除 d4d5d6=635 可以被 5 整除 d5d6d7=357 可以被 7 整除 d6d7d8=572 可以被 11 整除 d7d8d9=728 可以被 13 整除 d8d9d10=289 可以被 17 整除 請問由 0 ~ 9 的數字所組成的 pandigital 數,都符合上列性質的所有的數的總和是多少? 注:1406357289 是最小的一個,還有 5 個。 1406357289 1430952867 1460357289 4106357289 4130952867 4160357289 sum value 16695334890 */ // // ceshiyongde.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; long long strtol_adv(char * str, int len) { long long num=0; int i; for(i=0; i<=len-1; i++) { num=num*10+str[i]-'0'; } return num; } bool IsPassChongFu(int *a, int sub, int shiTanZhi)//通過重復驗證 { int i; for(i=0; i<sub; i++) { if(a[i] == shiTanZhi) return false; } return true; } bool IsPassChuSuShuYanZheng(int *a, int sub, int shiTanZhi)//通過除素數驗證 { int num; /* 1406357289是一個很有趣的數,首先他是由0~9這10個數字組成,而且每個數字只用了一次。 我們把1406357289的第一位稱作d1,第二位稱作d2……,最後一位稱作d10。你會發現以下規律 d2d3d4=406 可以被 2 整除 d3d4d5=063 可以被 3 整除 d4d5d6=635 可以被 5 整除 d5d6d7=357 可以被 7 整除 d6d7d8=572 可以被 11 整除 d7d8d9=728 可以被 13 整除 d8d9d10=289 可以被 17 整除 2,3,5,7,11,13,17恰好是連續的質數 */ if(sub == 10-1)//10 { num=a[7]*100+a[8]*10+shiTanZhi; if( (num % 17) == 0) { return true; } else return false; } if(sub == 9-1)// { num=a[6]*100+a[7]*10+shiTanZhi; if((num%13) == 0) { return true; } else return false; } if(sub == 8-1)// { num=a[5]*100+a[6]*10+shiTanZhi; if((num%11) == 0) { return true; } else return false; } if(sub == 7-1)// { num=a[4]*100+a[5]*10+shiTanZhi; if((num%7) == 0) { return true; } else return false; } if(sub == 6-1)// { num=a[3]*100+a[4]*10+shiTanZhi; if((num%5) == 0) { return true; } else return false; } if(sub == 5-1)// { num=a[2]*100+a[3]*10+shiTanZhi; if((num%3) == 0) { return true; } else return false; } if(sub == 4-1)// { num=a[5]*100+a[6]*10+shiTanZhi; if((num%2) == 0) { return true; } else return false; } return false; } void HuiSuoQiu() { char str[11]; char *stop; long long sum=0,temp; int a[10],i,j,k,t; int sub,shiTanZhi; int const MaxSub=9; int const MaxShiTanZhi=9; str[10]='\0'; a[0]=1; sub=1; shiTanZhi=0; while(true) { if(sub<0) break; if(sub> MaxSub)//生成可行解 { for(i=0; i<MaxSub+1; i++) { cout<<a[i]; str[i]=a[i]+'0'; } cout<<endl; temp=strtol_adv(str, strlen(str));//temp=strtol(str,&stop, 10); sum+=temp; ////////////////// sub--; shiTanZhi=a[sub]+1; } if(shiTanZhi > MaxShiTanZhi) { sub--; shiTanZhi=a[sub]+1; } else { //if(a[0]==1 && a[1]==4 && a[2]==0)//if(a[0]==1 && a[1]==4 && a[2]==0 && a[3]==6)//1406357289 // t=0; if( IsPassChongFu(a, sub, shiTanZhi) ) { if(sub>=3) { if( IsPassChuSuShuYanZheng(a, sub, shiTanZhi) ) { a[sub]=shiTanZhi; sub++; shiTanZhi=0; } else shiTanZhi++; } else { a[sub]=shiTanZhi; sub++; shiTanZhi=0; } } else { shiTanZhi++; } } } cout<<"sum value "<<sum<<endl; } int _tmain(int argc, _TCHAR* argv[]) { /* 1406357289是一個很有趣的數,首先他是由0~9這10個數字組成,而且每個數字只用了一次。 我們把1406357289的第一位稱作d1,第二位稱作d2……,最後一位稱作d10。你會發現以下規律 d2d3d4=406 可以被 2 整除 d3d4d5=063 可以被 3 整除 d4d5d6=635 可以被 5 整除 d5d6d7=357 可以被 7 整除 d6d7d8=572 可以被 11 整除 d7d8d9=728 可以被 13 整除 d8d9d10=289 可以被 17 整除 2,3,5,7,11,13,17恰好是連續的質數 請問用0~9這10個數字可以組成多少個像1406357289這樣的數呢?(每個數字只能使用一次) 請輸出所有可能的數之和! */ HuiSuoQiu(); //cout<<cntSuShu<<endl; getchar(); return 0; }