共有回帖数  0  个 
	 
	
	
	
     
          
          
               
				
			 
				
					 
 
            
				   - 
						
						
							 
									#include cstdlib 
#include iostream 
#include iomanip 
#include cmath 
#include string 
#include numeric 
#include vector 
#include set 
using namespace std; 
void z1(); 
void z2(); 
void z3(); 
void z4(); 
void z5(); 
void z6(); 
void z7(); 
void z8(); 
int c3(int, int); 
int draw(int(*)(double), int(*)(double), int); 
void z9(); 
string ten2(int); 
void z10(); 
int main() 
{ 
    z1(); 
    system("PAUSE"); 
    z2(); 
    system("PAUSE"); 
    z3(); 
    system("PAUSE"); 
    z4(); 
    system("PAUSE"); 
    z5(); 
    system("PAUSE"); 
    z6(); 
    system("PAUSE"); 
    z7(); 
    system("PAUSE"); 
    z8(); 
    system("PAUSE"); 
    z9(); 
    system("PAUSE"); 
    z10(); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
int draw(int(*f)(double x), int(*g)(double x), int z = 0) 
{ 
    int m, yy, n; 
    double y; 
    const int M = 62; 
    string s1, s2; 
    for (int i = 0; i  M; i++) 
        s1 += ' '; 
    for (yy = 0; yy = 20; yy++) 
    { 
        y = yy / 10.0; 
        s2 = s1; 
        m = (*f)(y); 
        s2[m] = '*'; 
        s2[M - m] = '*'; 
        if (z) 
        { 
            n = (*g)(y); 
            if (n  M && n  0) 
                s2[n] = '+'; 
        } 
        cout  s2  endl; 
    } 
    cout  endl; 
} 
/* TODO (#1#): 绘制余弦曲线 */ 
int f1(double x) 
{ 
    return (int)(acos(1-x) *10); 
} 
int f3(double x) 
{ 
    return 31-(int)(25 *sqrt(1-(x - 1)*(x - 1))); 
} 
int f2(double x) 
{ 
    return (int)(45 *(x - 1) + 31); 
} 
void z1() 
{ 
    draw(f1, f1); 
    return ; 
} 
/* TODO (#1#): 绘制余弦曲线和一条直线 
 */ 
void z2() 
{ 
    draw(f1, f2, 1); 
    return ; 
} 
void z3() 
{ 
    /* TODO (#1#): 绘制圆 */ 
    draw(f3, f1); 
    return ; 
} 
void z4() 
{ 
    /* TODO (#1#): 唱歌比赛 
    去掉最高分和最低分得到平均分 */ 
    int max, min, sum = 0; 
    int ii[10] = 
    { 
        1, 2, 3, 4, 5, 6, 7, 8, 9, 11 
    }; 
    max =  *max_element(ii, ii + 10); 
    min =  *min_element(ii, ii + 10); 
    sum = accumulate(ii, ii + 10, 0); 
    cout  "最高分 是	"  max  endl; 
    cout  "最低分 是	"  min  endl; 
    cout  "平均分 是	"  (double)(sum - max - min) / 8  endl; 
    cout  endl; 
    return ; 
} 
void z5() 
{ 
    /* TODO (#1#): 555555的最大的三位数约数是多少 */ 
    long j; 
    int i; 
    j = 555555; 
    for (i = 999; i  99; i--) 
    if (!(j % i)) 
    { 
        cout  j  "的最大的三位数约数是"  i  endl; 
        break; 
    } 
    cout  endl; 
    return ; 
} 
void z6() 
{ 
    /* TODO (#1#): 13的13次方的最后三位数是多少 */ 
    long j, y, kk = 1; 
    int i; 
    j = 13; 
    y = 13; 
    for (i = 1; i = y; i++) 
        kk *= j, kk %= 1000; 
    cout  j  "的"  y  "次方的最后三位数是"  kk  endl; 
    cout  endl; 
    return ; 
} 
void z7() 
{ 
    /* TODO (#1#): 100 !的末尾有多少个0 */ 
    int n, count = 0, i, j; 
    n = 100; 
    for (i = 5; i = n; i += 5) 
    { 
        count++; 
        for (j = 25; j = n; j *= 5) 
            if (!(i % j)) 
                count++; 
    } 
    cout  n  "!的末尾有"  count  "个0"  endl; 
    cout  endl; 
    return ; 
} 
void z8() 
{ 
    /* TODO (#1#): 5个取3个的排列的总数以及方法 */ 
    int n, count = 1; 
    cout  "5个取3个的排列的总数 是 n"; 
    vector  int  ve1; 
    set  int  se1; 
    for (int i = 1; i  6; i++) 
        ve1.push_back(i); 
    while (next_permutation(ve1.begin(), ve1.end())) 
    { 
        n = ve1[0] *100+ve1[1] *10+ve1[2]; 
        if (se1.find(n) == se1.end()) 
        { 
            se1.insert(n); 
            cout  count++  ":"  ve1[0]  ends  ve1[1]  ends  
                ve1[2]  endl; 
        } 
    } 
    cout  endl; 
    return ; 
} 
void z9() 
{ 
    /* TODO (#1#): 计算杨辉三角形 */ 
    int a, b, c = 12, count = 1; 
    cout  "杨辉三角形是"  endl; 
    for (b = 1; b = c; b++) 
    { 
        for (a = 1; a = c - b; a++) 
            cout  "   "; 
        for (a = 1; a = b + 1; a++) 
        { 
            cout  setw(5)  c3(b, a)  ends; 
        } 
        cout  endl; 
    } 
    return ; 
} 
int c3(int x, int y) 
{ 
    if (y == 1 || y == x + 1) 
        return 1; 
    return c3(x - 1, y - 1) + c3(x - 1, y); 
} 
/* TODO (#1#): 把10进制度变成2进制 */ 
string ten2(int x1) 
{ 
    string s1; 
    char ch[256]; 
    s1 = itoa(x1, ch, 2); 
    return s1; 
} 
/* TODO (#1#): 把10进制度变成2进制 */ 
void z10() 
{ 
    int num; 
    num = 256; 
    cout  "数"  num  "的二进制表示是"  ten2(num); 
    cout  endl; 
    return ; 
}
/*《c趣味编程》18-29题 
 */ 
#include cstdlib 
#include iostream 
#include cmath 
#include ctime 
#include vector 
using namespace std; 
const int MTOH = 86400; 
//24*60*60=86400,用于将秒化成天 
void z11(); 
void z12(); 
void z13(); 
void z14(); 
void z15(); 
void z16(); 
void z17(); 
/* TODO (#1#): 用于将y年m月d日化成秒 */ 
time_t mktime(int y, int m, int d); 
int main() 
{ 
 z11(); 
 system("PAUSE"); 
 z12(); 
 system("PAUSE"); 
 z13(); 
 system("PAUSE"); 
 z14(); 
 system("PAUSE"); 
 z15(); 
 system("PAUSE"); 
 z16(); 
 system("PAUSE"); 
 z17(); 
 system("PAUSE"); 
 return EXIT_SUCCESS; 
} 
void z12() 
/* TODO (#1#): 四位数前两位相同,后两位也相同,并且是个数 
的平方 
问他 是多少 */ 
{ 
 int num, i, j, n2; 
 for (i = 0; i  10; i++) 
 for (j = 0; j  10; j++) 
 if (i != j) 
 { 
 num = i * 1100+j * 11; 
 n2 = (int)sqrt(num); 
 if (num == n2 *n2) 
 cout  "四位数前两位相同,后两位也相同,并且是个数的平方"  
 num  "="  n2  "*"  n2  endl; 
 } 
 return ; 
} 
void z13() 
/* TODO (#1#): 银行月息0.63% 
一 人打算今后五年每年年底取1000,正好取完, 
问第一年应该存多少 */ 
{ 
 int a, b, c = 0; 
 double x = 1000, y = 0.0063, z; 
 z = 1000 / (1+12 * y); 
 for (b = 1; b  5; b++) 
 z = (z + 1000) / (1+12 * y); 
 cout  "银行月息0.63%一 人打算今后五年每年年底取1000"  endl  
 " ,正好取完,第一年应该存"  z  endl; 
 return ; 
} 
void z14() 
/* TODO (#1#): 整存整取存钱的利率 
1,2,3,5,8年的利率分别是 
0.63%,0.66%,0.69%,0.75%,0.84% 
存20年钱问怎样存 利最大 */ 
{ 
 const int NN = 5; 
 int ii; 
 double max = - 1, nx; 
 vector  int  ve1(5), sa(5, 0); 
 double lu[NN] = 
 { 
 0.0084, 0.0075, 0.0069, 0.0066, 0.0063 
 } 
 , ly[NN] = 
 { 
 8, 5, 3, 2, 1 
 } 
 , lx[5]; 
 for (ii = 0; ii  NN; ii++) 
 lx[ii] = 1+lu[ii] *ly[ii] *12; 
 for (sa[0] = 0; sa[0]  3; sa[0]++) 
 for (sa[1] = 0; sa[1]  5; sa[1]++) 
 for (sa[2] = 0; sa[2]  7; sa[2]++) 
 for (sa[3] = 0; sa[3]  11; sa[3]++) 
 { 
 sa[4] = 20-sa[0] *8-sa[1] *5-sa[2] *3-sa[3] *2; 
 if (sa[4] = 0) 
 { 
 nx = pow(lx[0], sa[0]) *pow(lx[1], sa[1]) *pow(lx[2], sa[2])*pow 
 (lx[3], sa[3]) *pow(lx[4], sa[4]); 
 if (nx  max) 
 { 
 ve1 = sa; 
 max = nx; 
 } 
 } 
 } 
 cout  "存20年钱这样存 利最大"  endl; 
 for (int i = 0; i  5; i++) 
 cout  ly  "年期存"  ve1  "次"  endl; 
 cout  2000 *max  endl; 
 return ; 
} 
void z15() 
/* TODO (#1#): 五人捕鱼 
a先将鱼分为5份,把多余的一条扔了,拿走自己 
的一份,bcde同样这样拿,问鱼最少多少条 */ 
{ 
 const int NN = 5; 
 int num, i, flag, xx; 
 for (num = 6; num  100000; num += 5) 
 { 
 for (i = 0, xx = num; i  NN; i++) 
 { 
 if (!((xx - 1) % 5)) 
 flag = 1, xx = 4 *(xx - 1) / 5; 
 else 
 flag = 0; 
 } 
 if (flag) 
 { 
 cout  "鱼最少"  num  "条"  endl; 
 break; 
 } 
 } 
 return ; 
} 
void z16() 
/* TODO (#1#): 卖鱼,第一次卖了1/2加1/2条 
第2次卖了1/3加1/3条 
第3次卖了1/4加1/4条 
第4次卖了1/5加1/5条 
余下11条 
问一开始是多少条 */ 
{ 
 const int NN = 5; 
 int nn, j, flag, n; 
 for (nn = 23; nn  1000; nn += 2) 
 { 
 n = nn; 
 flag = 0; 
 for (j = 1; j  NN; j++) 
 { 
 if ((n + 1) % (j + 1) == 0) 
 { 
 n -= (n + 1) / (j + 1); 
 flag += 1; 
 } 
 else 
 { 
 flag = 0; 
 break; 
 } 
 } 
 if (flag == NN - 1 && n == 11) 
 { 
 cout  "一开始有"  nn  "条鱼"  endl; 
 } 
 } 
 return ; 
} 
void z17() 
/* TODO (#1#): 21筐鱼,7筐满,7筐半,7筐空,在不倒出鱼的 
情况下,怎样平分为3份 */ 
{ 
 int a[3][3], b[3][3], i, j, m, tmp; 
 for (i = 1; i = 3; i++) 
 { 
 a[i - 1][0] = i; 
 a[i - 1][1] = 7-2 * i; 
 a[i - 1][2] = 7-i - a[i - 1][1]; 
 } 
 for (i = 0; i  3; i++) 
 for (j = 0; j  3; j++) 
 { 
 tmp = 5-i - j; 
 if (tmp  - 1 && tmp  3 && a[1] = a[j][1]) 
 { 
 for (m = 0; m  3; m++) 
 { 
 b[0][m] = a[m]; 
 b[1][m] = a[j][m]; 
 b[2][m] = a[tmp - 1][m]; 
 } 
 cout  "平分为3份的方法是 n"; 
 cout  "满半空 n"; 
 cout  b[0][0]  ends  b[0][1]  ends  b[0][2]  endl; 
 cout  b[1][0]  ends  b[1][1]  ends  b[1][2]  endl; 
 cout  b[2][0]  ends  b[2][1]  ends  b[2][2]  endl; 
 } 
 } 
 return ; 
} 
time_t mktime(int y, int m, int d) 
/* TODO (#1#): 用于将y年m月d日化成秒 */ 
{ 
 tm t; 
 t.tm_year = y - 1900; 
 t.tm_mon = m; 
 t.tm_mday = d; 
 t.tm_hour = 0; 
 t.tm_min = 0; 
 t.tm_sec = 0; 
 t.tm_isdst = 0; 
 return mktime(&t); 
} 
void z11() 
/* TODO (#1#): 某人是1999年9月29日生日 
问到2006年9月29日他活了多少天 */ 
{ 
 time_t t3, t4; 
 t3 = mktime(2006, 10, 21); 
 t4 = mktime(1999, 10, 21); 
 cout  "某人是1999年10月21日生日,到2006年10月21日他活了"  (t3 - t4) / 
 MTOH  "天"  endl; 
 return ; 
}
/*《c趣味编程》18-29题 
 */ 
#include cstdlib 
#include iostream 
#include cmath 
#include ctime 
#include vector 
#include map 
using namespace std; 
namespace YinZi 
{ 
 vector  int  ve2; 
 int minYinzi(const unsigned long x) 
 /* TODO (#1#): 得到一个数的最小因子 */ 
 { 
 int i, t = 0; 
 if (x % 2 == 0) 
 return 2; 
 for (i = 0; t = sqrt(x); i++) 
 { 
 t = ve2; 
 if (x % t == 0) 
 return t; 
 } 
 return x; 
 }; 
 unsigned long addYinZi(const unsigned long x) 
 /* TODO (#1#): 计算除了他自身之外的因子的和 */ 
 { 
 int t = - 1, y = x, m; 
 if (x == 1) 
 return 0; 
 if (x == 2) 
 return 1; 
 vector  int  ve1; 
 vector  int  ve2; 
 do 
 { 
 m = t; 
 t = minYinzi(y); 
 if (t == m) 
 ve2.back()++; 
 else 
 { 
 ve1.push_back(t); 
 ve2.push_back(1); 
 } 
 y /= t; 
 } 
 while (y != 1); 
 int i; 
 unsigned long Yinzihe = 1; 
 for (i = 0; i  ve2.size(); i++) 
 { 
 if (ve2 != 1) 
 Yinzihe *= ((unsigned long)pow((double)ve1, ve2 + 1) - 1) 
 / (ve1 - 1); 
 else 
 Yinzihe *= ve1 + 1; 
 } 
 Yinzihe -= x; 
 return Yinzihe; 
 }; 
}; 
long HueiWen(const long); 
void z18(); 
void z19(); 
void z20(); 
void z21(); 
void z22(); 
int Threeto2(int, int, int, long &); 
int issqr(int); 
void z23(); 
int Mihe(int); 
void z24(); 
int addYinZi(int); 
int isMPrime(int, long); 
void z25(); 
int isPrime(const long); 
void fillve2(); 
void z26(); 
long auton(int n); 
void z27(); 
void z28(); 
void z29(); 
int main() 
{ 
 //z27(); 
 z18(); 
 system("PAUSE"); 
 cout  endl; 
 z19(); 
 system("PAUSE"); 
 cout  endl; 
 z20(); 
 system("PAUSE"); 
 cout  endl; 
 z21(); 
 system("PAUSE"); 
 cout  endl; 
 z22(); 
 system("PAUSE"); 
 cout  endl; 
 z23(); 
 system("PAUSE"); 
 cout  endl; 
 z24(); 
 system("PAUSE"); 
 cout  endl; 
 z25(); 
 system("PAUSE"); 
 cout  endl; 
 z26(); 
 system("PAUSE"); 
 cout  endl; 
 z27(); 
 system("PAUSE"); 
 cout  endl; 
 z28(); 
 system("PAUSE"); 
 cout  endl; 
 z29(); 
 system("PAUSE"); 
 cout  endl; 
 return EXIT_SUCCESS; 
} 
void z18() 
/* 个位数为6并且可以 被3整除的数有多少个 */ 
{ 
 cout  "位数为6并且可以 被3整除的数有"  endl  endl; 
 int c = 0; 
 for (int b = 1000; b = 9999; b++) 
 if (!((b *10+6) % 3)) 
 c++; 
 cout  c  "个"  endl; 
 return ; 
} 
void z19() 
/* TODO (#1#): 一个数被8除余1,所得的商被8除也余1,第二次 
的商被8除余7,最后的商为a,又知这个数被17 
除余4,所得的商被17除余15,最后的商是a的2 
倍,问这个数是多少 */ 
{ 
 cout  "一个数被8除余1,所得的商被8除也余1,第二次"  endl; 
 cout  "的商被8除余7,最后的商为a,又知这个数被17"  endl; 
 cout  "除余4,所得的商被17除余15,最后的商是a的2倍"  endl; 
 long x, y, i = 1; 
 do 
 { 
 x = i; 
 x = x * 8+7; 
 x = x * 8+1; 
 x = x * 8+1; 
 y = i; 
 y = 2 * y * 17+15; 
 y = y * 17+4; 
 i++; 
 } 
 while (x != y); 
 cout  "这个数是 "  x  endl; 
} 
void z20() 
/* TODO (#1#): 一个数的七进制表示是abc,而他的九进制表示 
是cba,问这个数是 多少 */ 
{ 
 cout  "一个数的七进制表示是abc,而他的九进制表示是cba"  endl; 
 char ch[7]; 
 string s1, s2, s3; 
 for (int i = 100; i  999; i++) 
{ 
 s1 = itoa(i, ch, 7); 
 s3 = s1; 
 s2 = itoa(i, ch, 9); 
 reverse(s1.begin(), s1.end()); 
 if (s1 == s2) 
 { 
 cout  "这个数是 "  s3  '('  7  ')'; 
 cout  "="  s2  '('  9  ')'; 
 cout  "="  i  '('  10  ')'  endl; 
 break; 
 } 
 } 
} 
long HueiWen(const long x1) 
/* TODO (#1#): 得到一个数的回文数 */ 
{ 
 char ch[100]; 
 string s1; 
 long m; 
 s1 = ltoa(x1, ch, 10); 
 reverse(s1.begin(), s1.end()); 
 m = atol(s1.c_str()); 
 return m; 
} 
void z21() 
/* TODO (#1#): 一个数的九倍是他的回文数,这个数是多少 */ 
{ 
 cout  "一个数的九倍是他的回文数"  endl; 
 int c = 0; 
 for (int b = 1000; b = 9999; b++) 
 if (HueiWen(b) == b *9) 
 { 
 cout  "这个数是 "  b  endl; 
 cout  "他的九倍是 "  b *9  endl; 
 } 
 return ; 
} 
void z22() 
/* TODO (#1#): 95859后的回文数(最接近他的)是多少 */ 
{ 
 cout  "95859后的回文数(最接近他的)是"  endl; 
 int c = 95859; 
 do 
 { 
 c++; 
 } 
 while (HueiWen© != c); 
 cout  c  endl; 
 return ; 
} 
void z23() 
/* TODO (#1#): 有两个平方三位数abc和xyz,正好组成三个平方两位数 
这两个数是多少 */ 
{ 
 cout  "有两个平方三位数abc和xyz,正好组成三个平方两位数"  endl; 
 int i, j, k; 
 long e; 
 int m, n; 
 for (i = 4; i = 9; i++) 
 for (j = 0; j = 9; j++) 
 for (k = 0; k = 9; k++) 
 if (Threeto2(i, j, k, e)) 
 { 
 cout  "三个平方两位数是:"  endl; 
 cout  "1:"  i *i  "="  i  "*"  i  endl; 
 cout  "2:"  j *j  "="  j  "*"  j  endl; 
 cout  "3:"  k *k  "="  k  "*"  k  endl; 
 cout  "两个平方三位数是:"  endl; 
 m = (int)sqrt(e % 1000); 
 n = (int)sqrt(e / 1000); 
 cout  "1:"  m *m  "="  m  "*"  m  endl; 
 cout  "2:"  n *n  "="  n  "*"  n  endl; 
 } 
 return ; 
} 
int Threeto2(int x, int n, int c, long &nn) 
/* TODO (#1#): 通过3个两位数得到两个三位数 */ 
{ 
 int d[3], t1, t2; 
 string s1, s2, s3, s4; 
 char ch[11]; 
 d[0] = x * x; 
 d[1] = n * n; 
 d[2] = c * c; 
 for (int i = 0; i  3; i++) 
 { 
 s4 = itoa(d, ch, 10); 
 if (s4.size() == 1) 
 s4 = '0' + s4; 
 s1 = s1 + s4; 
 } 
 s2 = s2 + s1[0] + s1[2] + s1[4]; 
 s3 = s3 + s1[1] + s1[3] + s1[5]; 
 t1 = atoi(s2.c_str()); 
 t2 = atoi(s3.c_str()); 
 if (issqr(t1) && issqr(t2)) 
 { 
 nn = t1 * 1000+t2; 
 return 1; 
 } 
 return 0; 
} 
int issqr(int x) 
/* TODO (#1#): 判断一个数a是不是完全平方数,如9=3*3 
 */ 
{ 
 int n; 
 n = (int)sqrt(x); 
 return (n *n == x); 
} 
int Mihe(int x) 
/* TODO (#1#): 各位数的幂和 
如153,3得到1^3+5^3+3^3 */ 
{ 
 int t, i, m = 0, n; 
 n = (int)log10(x) + 1; 
 while (x) 
 { 
 t = x % 10; 
 x /= 10; 
 m += (int)pow((double)t, n); 
 } 
 return m; 
} 
void z24() 
/* TODO (#1#): 一个n位数,其各位数的幂和等于他自身 
如153=1^3+5^3+3^3 
找出这样的数 */ 
{ 
 cout  "一个n位数,其各位数的幂和等于他自身"  endl; 
 int i, j, k, m; 
 for (j = 3; j  7; j++) 
 { 
 cout  "n为 "  j  " 时:"  endl; 
 k = (int)pow(10.0, j - 1); 
 m = (int)pow(10.0, j); 
 ; 
 for (i = k; i  m; i++) 
 if (i == Mihe(i)) 
 cout  i  endl; 
 } 
 return ; 
} 
inline int addYinZi(int x) 
/* TODO (#1#): 得到一个数的因子之和 */ 
{ 
 int y, i; 
 y = 0; 
 for (i = 1; i = x / 2; i++) 
 if (!(x % i)) 
 y += i; 
 return y; 
} 
void z25() 
/* TODO (#1#): 数学家发现有这样一种数,它的约数(不含它本 
身)的和恰好等于它本身。如6=1+2+3, 
28=1+2+4+7+14。具有这种性质的第三个数是496 
,第四个数是8128……。人们把这样的数叫做完全 
数。 
我们可以观察提供给我们的四个完全数6、28 
、496、8128,这四个数都是偶数,而且个位上 
的数都是6或8,我们可以这样猜想,第五个完全 
数的完全数乃至所有的完全数可能都是偶数,而 
且个位上的数可能都是6或8。接着,我们可以再 
观察6、8、28、496、8128的约数:6的约数有1 
、2、3、6;28的约数有1、2、4、7、14、28; 
496的约数有1、2、4、8、16、31、62、124、 
248、496;8128的约数有1、2、4、8、16、32、 
64、127、254、508、1016、2032、4064、8128 
。我们把这四组约数看成四个数列,从小到大看 
,从大到小看,再对比每相邻两个数之间的关系 
,可以发现,它们之间的关系几乎都是后一个数 
是前一个数的2倍,只有处在最中间的2和3,4和 
7,16和31,64和127不是这种关系。我们再研究 
这四组数,可以发现:2×3=6,4×7=28,16×31 
=496,64×127=8128;而且这四组乘法算式的 
两个因数都是一个偶数和一个奇数。再观察四个 
偶数,可以发现,2=2^1,4=2^2,16=2^4,64= 
2^6。而四个奇数都是质数,且3=2^2-1,7=2^3 
-1,31=2^5-1,127=2^7-1。这样,我们可以 
进一步猜想,完全数可以分解成两个因数,其中 
一个因数是2的若干次方,另一个因数是2的若干 
次方减去1的差,并且是质数。 
完全数的特点: 
是2^(n-1)×(2^n-1),且2^n-1是质数,前四个完 
全数可以这样表示:6=2^(2-1)×(2^2-1);28= 
2(3-1)×(2^3-1);496=2(5-1)×(2^5-1); 
8128=2^(7-1)×(2^7-1)。那么下一个完全数是 
多少呢?必须找到下一个(2^n-1)是质数,它 
就是2^13-1=8191,那么第五个完全数是2^(13-1)× 
(2^13-1)=4096×8191=33550336。 
目前,人们通过分布式计算已经找到44个梅森素数, 
 */ 
/*****************************************************************/ 
{ 
 cout  "1000000000以内的梅森素数有:"  endl; 
 unsigned long num = 0; 
 int m, t = 0; 
 fillve2(); 
 while (num  1000000000) 
 { 
 m = YinZi::ve2[t++]; 
 num = (int)pow(2.0, m) - 1; 
 if (isMPrime(m, num)) 
 //if(isPrime(num)) 
 cout  "2^"  m  "-1="  num  endl; 
 } 
} 
void z26() 
/***************************************************************** 
计算相亲数 
说明:相亲数是指两个数x,y,数x的因子之和正好等于y, 
而数y的因子之和正好等于x 。 
 *****************************************************************/ 
{ 
 int num, m; 
 double cl1, cl2; 
 const int MAX = 400000; 
 int m1, k, n = 1; 
 vector  int  ve1; 
 ve1.reserve(MAX); 
 fillve2(); 
 cl1 = clock() / CLOCKS_PER_SEC; 
 cout  "400000以内的相亲数有:"  endl; 
 ve1.push_back(0); 
 for (num = 1; num  MAX; num++) 
 { 
 m1 = YinZi::addYinZi(num); 
 ve1.push_back(m1); 
 if (m1  num) 
 { 
 k = ve1[m1]; 
 if (k == num) 
 { 
 cout  n++  ":"; 
 cout.width(8); 
 cout  k  ends  m1  endl; 
 } 
 } 
 } 
 cl2 = clock() / CLOCKS_PER_SEC; 
 cout  "消耗"  cl2 - cl1  "秒"  endl; 
} 
void z27() 
/* TODO (#1#): 自守数(Automorphic Number):一个数的任意次幂 
的末几位数字等于这个数本身。在十进制,5、6 
、25、76、376、625都是自守数。 
在k位数中,最多有两个自守数,一个个位数字 
为5,另一个个位数字为6。 
一个形式为n=0(mod 2^k),n=1(mod 5^k) ;另一个 
形式为n=1(mod 2^k),n=0(mod 5^k) 。其和必定为 
10^k+1。 */ 
{ 
 cout  "第十位自守数是:"  auton(10)  endl; 
 return ; 
} 
void z28() 
/* TODO (#1#): 数11的平方121是回文数 
找出这样的数 */ 
{ 
 cout  "平方是回文数的数有:"  endl; 
 int i; 
 long j; 
 for (i = 1; i  12000; i++) 
 { 
 j = i * i; 
 if (HueiWen(j) == j) 
 { 
 cout.width(6); 
 cout  i  ends  j  endl; 
 } 
 } 
 return ; 
} 
void z29() 
/* TODO (#1#): 3025这样的数 
有(30+25)^2=3025 
找出这样的数 */ 
{ 
 cout  "3025这样的数有(30+25)^2=3025"  endl; 
 cout  "类似这样的数有"  endl; 
 int i; 
 long j, m; 
 for (i = 1000; i  10000; i++) 
 { 
 j = i / 100; 
 m = i % 100; 
 if ((j + m)*(j + m) == i) 
 cout  i  endl; 
 } 
 return ; 
} 
int isPrime(const long x) 
/* TODO (#1#): 用最慢的试除法验证一个数是不是素数 */ 
{ 
 if (x == 2) 
 return 1; 
 if (x % 2 == 0) 
 return 0; 
 for (int i = 3; i = sqrt(x); i += 2) 
 if (!(x % i)) 
 return 0; 
 return 1; 
} 
void fillve2() 
/* TODO (#1#): 填充1~1000里的素数到ve2用于 26题*/ 
{ 
 YinZi::ve2.clear(); 
 for (int i = 3; i  1000; i += 2) 
 { 
 if (isPrime(i)) 
 YinZi::ve2.push_back(i); 
 } 
} 
int isMPrime(int m, long num) 
/* TODO (#1#): 用专门用来测试梅森素数的测试方法测试他是否 
是素数 */ 
{ 
 unsigned __int64 n = 4; 
 for (int i = 0; i  m - 2; i++) 
 n = ((n)*(n) - 2) % num; 
 return (n == 0); 
} 
long auton(int n) 
/* TODO (#1#): 计算1~10位自守数 ,超过10将得到错误结果*/ 
{ 
 if (n == 1) 
 return 6; 
 int i; 
 long j, m, k, p; 
 long nn; 
 k = (long)pow(10.0, n - 1); 
 p = auton(n - 1); 
 for (i = 0; i  10; i++) 
 { 
 nn = i * k + p; 
 j = (int)pow(2.0, n); 
 m = (int)pow(5.0, n); 
 if ((nn % j == 0) && (nn % m == 1)) 
 break; 
 } 
 return nn; 
}
/*《c趣味编程》30-35题 
 */ 
#include cstdlib 
#include iostream 
#include cmath 
#include set 
#include vector 
#include ctime 
using namespace std; 
int isPrime(const long); 
void z30(); 
void z31(); 
void z32(); 
void z33(); 
void z34(); 
void z35(); 
long HueiWen(const long); 
//以下是第35题用到的函数 
class SushuHuanFang 
{ 
 string zz[1000]; 
 set  int  se2; 
 set  int  se3; 
 set  int  se4; 
 set  string  se1; 
 long is13(const long); 
 int isTwo(const int, const int); 
 int isThree(const int, const int, const int); 
 int isFour(const int, const int, const int, const int); 
 int isHueiPrime(const int); 
 string sts(const string, const int); 
 string ntos(const int x); 
 public: 
 vector  string  mm2; 
 SushuHuanFang(); 
 int FillArray(); 
 //SushuHuanFang(int x); 
 virtual ~SushuHuanFang(); 
}; 
int main() 
{ 
 z30(); 
 system("PAUSE"); 
 z31(); 
 system("PAUSE"); 
 z32(); 
 system("PAUSE"); 
 z33(); 
 system("PAUSE"); 
 z34(); 
 system("PAUSE"); 
 z35(); 
 system("PAUSE"); 
 return EXIT_SUCCESS; 
} 
/* TODO (#1#): 用最慢的试除法验证一个数是不是素数 */ 
int isPrime(const long x) 
{ 
 if (x == 2) 
 return 1; 
 if (x % 2 == 0) 
 return 0; 
 for (int i = 3; i = sqrt(x); i += 2) 
 if (!(x % i)) 
 return 0; 
 return 1; 
} 
/***************************************************************** 
计算素数 
说明:素数是指一个数只有1和他本身两个因子的数 
 *****************************************************************/ 
void z30() 
{ 
 cout  "10000以内的素数是:"  endl; 
 long i; 
 int n = 0; 
 for (i = 2; i  10000; i++) 
 if (isPrime(i)) 
 { 
 if (!(n % 11)) 
 cout  endl; 
 n++; 
 cout.width(7); 
 cout  i; 
 } 
 return ; 
} 
/***************************************************************** 
验证哥德巴赫猜想 
说明:哥德巴赫猜想是指任何一个大于6的偶数可以分解成两个素数的和 
 *****************************************************************/ 
void z31() 
{ 
 long i, j; 
 int n = 1; 
 cout  "验证哥德巴赫猜想"  endl; 
 for (i = 6; i  1000; i += 2) 
 for (j = 3; j  i; j += 2) 
 if (isPrime(j)) 
 if (isPrime(i - j)) 
 { 
 cout.width(7); 
 cout  i  "="  j  "+"  i - j; 
 if (!(n % 5)) 
 cout  endl; 
 n++; 
 break; 
 } 
 return ; 
} 
/***************************************************************** 
计算可逆素数 
说明:可逆素数是指一个数abcdef……和他的回文数……fedcba都是素数的数 
同时 abcdef……小于他的回文数 
 *****************************************************************/ 
void z32() 
{ 
 const int MAX = 10; 
 //max是一行显示几个 
 const long MMAX = 100000; 
 //MMAX以内的回文素数是:; 
 long i, j; 
 int n = 0; 
 cout  MMAX  "以内的回文素数是:"; 
 for (i = 3; i  MMAX; i++) 
 { 
 j = HueiWen(i); 
 if (isPrime(i) && isPrime(j) && i  j) 
 { 
 if (!(n % MAX)) 
 cout  endl; 
 n++; 
 cout.width(6); 
 cout  i; 
 } 
 } 
 return ; 
} 
/***************************************************************** 
计算回文素数 
说明:回文素数是指一个数abcdef……和他的回文数……fedcba都是素数的数 
同时 abcdef……等于他的回文数……fedcba 
 *****************************************************************/
void z33() 
{ 
 const int MAX = 10; 
 //max是一行显示几个 
 const long MMAX = 100000; 
 //MMAX以内的回文素数是:; 
 long i, j; 
 int n = 0; 
 cout  MMAX  "以内的回文素数是:"; 
 for (i = 3; i  MMAX; i++) 
 { 
 j = HueiWen(i); 
 if (isPrime(i) && isPrime(j) && i == j) 
 { 
 if (!(n % MAX)) 
 cout  endl; 
 n++; 
 cout.width(6); 
 cout  i; 
 } 
 } 
 return ; 
} 
/***************************************************************** 
问题:将不超过1993的素数(包括2)从小到大排成 一行 
第二行上每个数都是他的右边肩头的数与左边肩头的数的差 
第二行是否存在若干连续的数学他们的和是1898 
说明:其实问题就是求两个素数的差是1898 
 *****************************************************************/ 
void z34() 
{ 
 long i, j; 
 int n = 1; 
 for (i = 3; i  100; i++, j = i + 1898) 
 if (isPrime(i) && isPrime(j)) 
 { 
 cout  "("  n  "):"  i  "... ..."  j  endl; 
 n++; 
 } 
 return ; 
} 
/***************************************************************** 
问题:计算回文素数幻方. 
回文素数幻方是一个4*4的数组,其中横线竖线和斜线10条线全部是 回文素数 
这个程序首先得到第一,二,四行的数,然后通过 第一,二,四行的数 
得到 第三行的数,然后判断 第三行的数和斜线三数是不是 回文素数, 
所以程序非常快。 
说明:如结果 
1933 
9133 
1789 
3391 
横线四数1933,9133,1789,3391和 
竖线四数1913,9773,3389,3391和 
斜线二数1181,3373均是 回文素数 
 *****************************************************************/ 
void z35() 
{ 
 cout  "计算回文素数幻方."  endl; 
 SushuHuanFang j; 
 int i; 
 j.FillArray(); 
 for (i = 0; i  j.mm2.size(); i++) 
 cout  "("  i + 1  "):"  j.mm2  endl; 
 return ; 
} 
/* TODO (#1#): 得到一个数的回文数 */ 
long HueiWen(const long x1) 
{ 
 const int TEN = 10; 
 int m = 0; 
 long x = x1; 
 while (x) 
 { 
 m = m * TEN + x % TEN; 
 x /= TEN; 
 } 
 return m; 
} 
string SushuHuanFang::ntos(const int x1) 
{ 
 /* TODO (#2#): 数字变成字符串 */ 
 string s1; 
 char ch[4]; 
 s1 = itoa(x1, ch, 10); 
 return s1; 
} 
string SushuHuanFang::sts(const string s2, const int i = 0) 
{ 
 /* TODO (#2#): 通过一个解旋转变换另一个解 */ 
 string s3 = ""; 
 switch (i) 
 { 
 case 0: 
 s3 = s3 + s2[12] + s2[8] + s2[4] + s2[0] + s2[13] + s2[9] + s2[5] + 
 s2[1] + s2[14] + s2[10] + s2[6] + s2[2] + s2[15] + s2[11] + 
 s2[7] + s2[3]; 
 break; 
 case 2: 
 s3 = s3 + s2[3] + s2[2] + s2[1] + s2[0] + s2[7] + s2[6] + s2[5] + 
 s2[4] + s2[11] + s2[10] + s2[9] + s2[8] + s2[15] + s2[14] + 
 s2[13] + s2[12]; 
 break; 
 } 
 return s3; 
} 
long SushuHuanFang::is13(const long x1) 
{ 
 /* TODO (#2#): 判断是否是一个各位数是1379的数 
 */ 
 int t, i; 
 long x = x1; 
 while (x) 
 { 
 t = x % 10; 
 if (t % 2 == 0 || t == 5) 
 return 0; 
 x /= 10; 
 } 
 return 1; 
} 
int SushuHuanFang::isHueiPrime(const int x) 
{ 
 /* TODO (#3#): 判断一个数是否是四位回文素数 */ 
 if (x  1000) 
 return 0; 
 if (isPrime(x) && isPrime(HueiWen(x))) 
 return 1; 
 return 0; 
} 
int SushuHuanFang::isThree(const int x, const int y, const int z) 
{ 
 string s1, s2, s3, s4, s5; 
 char ch[6]; 
 s1 = itoa(x, ch, 10); 
 s2 = itoa(y, ch, 10); 
 s5 = itoa(z, ch, 10); 
for (int i = 0; i  4; i++) 
 { 
 s3 = s4 + s1 + s2 + s5; 
 if (se3.find(atoi(s3.c_str())) == se3.end()) 
 return 0; 
 } 
 return 1; 
} 
int SushuHuanFang::isFour(const int x, const int y, const int z, const int t) 
{ 
 string s1, s2, s3, s4, s5, s6; 
 char ch[6]; 
 s1 = itoa(x, ch, 10); 
 s2 = itoa(y, ch, 10); 
 s5 = itoa(z, ch, 10); 
 s6 = itoa(t, ch, 10); 
 for (int i = 0; i  4; i++) 
 { 
 s3 = s4 + s1 + s2 + s5 + s6; 
 if (se4.find(atoi(s3.c_str())) == se4.end()) 
 return 0; 
 } 
 s3 = s4 + s1[0] + s2[1] + s5[2] + s6[3]; 
 if (se4.find(atoi(s3.c_str())) == se4.end()) 
 return 0; 
 s3 = s4 + s1[3] + s2[2] + s5[1] + s6[0]; 
 if (se4.find(atoi(s3.c_str())) == se4.end()) 
 return 0; 
 return 1; 
} 
int SushuHuanFang::isTwo(const int x, const int y) 
{ 
 string s1, s2, s3, s4; 
 //if(!is13(x))return 0; 
 char ch[6]; 
 s1 = itoa(x, ch, 10); 
 s2 = itoa(y, ch, 10); 
 for (int i = 0; i  4; i++) 
 { 
 s3 = s4 + s1 + s2; 
 if (se2.find(atoi(s3.c_str())) == se2.end()) 
 return 0; 
 } 
 s3 = s4 + s1[0] + s2[1]; 
 if (se2.find(atoi(s3.c_str())) == se2.end()) 
 return 0; 
 s3 = s4 + s1[3] + s2[2]; 
 if (se2.find(atoi(s3.c_str())) == se2.end()) 
 return 0; 
 return 1; 
} 
int SushuHuanFang::FillArray() 
{ 
 double cl1, cl2; 
 vector  int  ve1, ve2; 
 string s2, s3, s4; 
 string mm1; 
 cl1 = clock() / CLOCKS_PER_SEC; 
 for (int i = 1001, n = 0; i  9999; i += 2) 
 { 
 if (isPrime(i) && isPrime(HueiWen(i))) 
 { 
 ve1.push_back(i); 
 se2.insert(i / 100); 
 se3.insert(i / 10); 
 se4.insert(i); 
 if (is13(i)) 
 { 
 /* TODO (#1#): 
 因为第一行和第四行的数字的各数只能是1,3,7,9 
 */ 
 ve2.push_back(i); 
 } 
 } 
 } 
 //for(int i=0;ive2.size();i++)coutiendsve2endl; 
 //coutse2.size()endsse3.size()endl; 
 /* TODO (#1#): 上面填充数组ve2,ve1保存所有的回文素数 */ 
 int k = 0; 
 //因为已经知道答案只有17个所以有 mm2.size()!=17 
 for (int i = 0; i  ve2.size() && mm2.size() != 17; i++) 
 if (HueiWen(ve1)  ve1) 
 for (int j = 0; j  ve1.size(); j++) 
 if (isTwo(ve2, ve1[j])) 
 for (int m = 0; m  ve1.size(); m++) 
 if (isThree(ve2, ve1[j], ve1[m])) 
 for (int mt = 0; mt  ve2.size(); mt++) 
 if (isFour(ve2, ve1[j], ve1[m], ve2[mt])) 
 { 
 s2 = ntos(ve2) + ntos(ve1[j]) + ntos(ve1[m]) + ntos(ve2[mt]); 
 if (se1.find(s2) == se1.end()) 
 { 
 mm2.push_back(s2); 
 cout  "..."; 
 s3 = sts(s2); 
 s4 = sts(s3, 2); 
 se1.insert(s4); 
 se1.insert(s3); 
 s3 = sts(s3); 
 s4 = sts(s3, 2); 
 se1.insert(s4); 
 se1.insert(s3); 
 s3 = sts(s3); 
 s4 = sts(s3, 2); 
 se1.insert(s4); 
 se1.insert(s3); 
 s3 = sts(s3); 
 s4 = sts(s3, 2); 
 se1.insert(s4); 
 //se1.insert(s3); 
 //八个 通过变换得到的解只有这个可以去掉 
 } 
 } 
 /* TODO (#2#): 上面填充数组mm2,mm2保存所有合适的解 */ 
 cl2 = clock() / CLOCKS_PER_SEC; 
 cout  "消耗"  cl2 - cl1  "秒"  endl; 
 return 1; 
} 
SushuHuanFang::SushuHuanFang(){ 
} 
SushuHuanFang::~SushuHuanFang(){ 
}
/*《c趣味编程》36-41题 
 */ 
#include cstdlib 
#include iostream 
using namespace std; 
int z36(); 
int z37(); 
int z38(); 
int z39(); 
int z40(); 
int z41(); 
int main() 
{ 
 z36(); 
 system("PAUSE"); 
 z37(); 
 system("PAUSE"); 
 z38(); 
 system("PAUSE"); 
 z39(); 
 system("PAUSE"); 
 z40(); 
 system("PAUSE"); 
 z41(); 
 system("PAUSE"); 
 return EXIT_SUCCESS; 
} 
int z36() 
/* TODO (#1#): 解不定方程 
x+y+z=100 
5*x+3*y+z/3=100 
x,y,z都是整数并且大于0 */ 
{ 
 cout  "不定方程"  endl  "x+y+z=100"  endl  "5*x+3*y+z/3=100"  
 endl  "的解是"  endl; 
 int i, j; 
 int n = 0; 
 for (i = 0; i  20; i++) 
 for (j = 0; j  33; j++) 
 { 
 n = 100-i - j; 
 if (!(n % 3) && (i *5+3 * j + n / 3 == 100)) 
 cout  "x="  i  ends  "y="  j  ends  "z="  n  endl; 
 } 
 return 1; 
} 
int z37() 
/* TODO (#1#): 解同余方程 
x=1(mod 2) 
x=2(mod 3) 
x=4(mod 5) 
x=5(mod 6) 
x=0(mod 7) */ 
{ 
 int x = 0; 
 int ar[2][5] = 
 { 
 { 
 1, 2, 4, 5, 0 
 } 
 , 
 { 
 2, 3, 5, 6, 7 
 } 
 }; 
 int w; 
 do 
 { 
 w = 1; 
 for (int i = 0; i  5; i++) 
 w = w && (x % ar[1]) == ar[0]; 
 x++; 
 } 
 while (!w); 
 cout  "同余方程的解是: "  x - 1  endl; 
 return 1; 
} 
int z38() 
/* TODO (#1#): 解方程x*5+y*2+z=100 */ 
{ 
 int i, j, m, n = 0; 
 for (i = 1; i  20; i++) 
 for (j = 1; j  50; j++) 
 { 
 m = 100-i * 5-j * 2; 
 if (m  0) 
 { 
 cout  n  ":x="  i  ends  "y="  j  ends  "z="  m 
  endl; 
 n++; 
 } 
 } 
 return 1; 
} 
int z39() 
/* TODO (#1#): 四数成等差数列 
并且他们的和是26 
积是880 
输出有二十项的上面的等差数列 */ 
{ 
 for (int i = 1; i = 3; i++) 
 { 
 int j; 
 j = (26-6 * i); 
 if (!(j % 4)) 
 { 
 j /= 4; 
 if (j *(j + i)*(j + 2 * i)*(j + 3 * i) == 880) 
 { 
 cout  "等差数列的首项和公差分别是:"  endl; 
 cout  i  ends  j  endl; 
 cout  "等差数列的前二十项是:"  endl; 
 for (int n = 0; n  20; n++) 
 cout  j + n * i  ends; 
 } 
 } 
 } 
 return 1; 
} 
int z40() 
/* TODO (#1#): 口袋里有12个东西 
其中3红,3黑,6绿 
任取八个有多少不同的颜色搭配 */ 
{ 
 cout  "口袋里有12个东西其中3红,3黑,6绿任取八个的取法是"  endl; 
 int i, j, m, n = 1; 
 for (i = 0; i = 3; i++) 
 for (j = 0; j = 3; j++) 
 { 
 m = 8-i - j; 
 if (m = 6) 
 { 
 cout  n  ":"  i  ends  j  ends  m  endl; 
 n++; 
 } 
 } 
 return 1; 
} 
int z41() 
/* TODO (#1#): 解方程 
x+y+z=30 
3*x+2*y+z=50 */ 
{ 
 cout  "不定方程"  endl  "x+y+z=30"  endl  "3*x+2*y+z=50"  endl 
  "的解是"  endl; 
 int i, j, m, n = 1; 
 for (i = 0; i = 10; i++) 
 { 
 j = 20-2 * i; 
 m = 30-j - i; 
 if (3 *i + 2 * j + m == 50) 
 { 
 cout  n  ":"  i  ends  j  ends  m  endl; 
 n++; 
 } 
 } 
 return 1; 
}
/* 
Name: 第七章----逻辑推理与判断 
Description: 《c趣味编程》48-57题 
 */ 
#include cstdlib 
#include iostream 
#include string 
#include bitset 
#include vector 
using namespace std; 
void z48(); 
void z49(); 
void z50(); 
void z51(); 
int isHere(int, int, int, int, int, int); 
void z52(); 
int isHere(int, int, int, int, int); 
void z53(); 
void z54(); 
void z55(); 
void z56(); 
void z57(); 
int main() 
{ 
 z48(); 
 system("PAUSE"); 
 z49(); 
 system("PAUSE"); 
 z50(); 
 system("PAUSE"); 
 z51(); 
 system("PAUSE"); 
 z52(); 
 system("PAUSE"); 
 z53(); 
 system("PAUSE"); 
 z54(); 
 system("PAUSE"); 
 z55(); 
 system("PAUSE"); 
 z56(); 
 system("PAUSE"); 
 z57(); 
 system("PAUSE"); 
 return EXIT_SUCCESS; 
} 
/* TODO (#1#): 新郎与新娘 
x不与a结婚 
m1[0]!=0 
x不与c结婚 
m1[0]!=2 
z不与c结婚 
m1[2]!=2 
一对一的关系 
m1[0]!=m1[1] &&m1[1]!=m1[2] &&m1[2]!=m1[0] 
 */ 
void z48() 
{ 
 string s12 = " 结婚 "; 
 vector  int  v1; 
 for (int i = 0; i  3; i++) 
 v1.push_back(i); 
 while (next_permutation(v1.begin(), v1.end())) 
 { 
 if (v1[0] != 0 && v1[0] != 2 && v1[2] != 2) 
 for (int i = 0; i  3; i++) 
 cout  (char)('X' + i)  s12  (char)('A' + v1)  endl; 
 } 
 return ; 
} 
/* TODO (#1#): 六个人按照条件挑选去和留,条件是 
a和b至少去一个人 
m1[0]+m1[1]1 
a和d不能一起去 
m1[0]+m1[3]!=2 
a,e,f三人里要去两人 
m1[0]+m1[4]+m1[5]==2 
b和c都去 或者 都不去 
(m1[1]+m1[2]==0 || m1[1]+m1[2]==2) 
c和d两人中只去一个 
m1[2]+m1[3]==1 
如果d不去则e也不去 
(m1[3]+m1[4]==0 || m1[3]==1) 
 */ 
void z49() 
{ 
 string s11[2] = 
 { 
 "不去", "去" 
 } 
 , s12 = " 将会"; 
 for (int j = 0; j = 64; j++) 
 { 
 bitset  6  m1(j); 
 //abcdef 
 //012345 
 if (m1[0] + m1[1]  1 && m1[0] + m1[3] != 2 && m1[0] + m1[4] + m1[5] == 
 2 && (m1[1] + m1[2] == 0 || m1[1] + m1[2] == 2) && m1[2] + m1[3] == 
 1 && (m1[3] + m1[4] == 0 || m1[3] == 1)) 
 for (int i = 0; i  6; i++) 
 cout  (char)('A' + i)  s12  s11[m1]  endl; 
 } 
 return ; 
} 
/* TODO (#1#): 谁在说谎 
a说b在说谎 
(m1[0]&&!m1[1]|| ! m1[0]&&m1[1]) 
b说c在说谎 
(m1[2]&&!m1[1]|| ! m1[2]&&m1[1]) 
c说a和b都在说谎 
(m1[2]&&m1[0]+m1[1]==0 || !m1[2]&&m1[0]+m1[1]!=0) 
问他们谁在说真话谁在说谎 */ 
void z50() 
{ 
 string s11[2] = 
 { 
 "说谎者", "诚实者" 
 } 
 , s12 = " 是 "; 
 for (int j = 1; j = 8; j++) 
 { 
 bitset  3  m1(j); 
 //abcdef 
 //012345 
 if ((m1[0] && !m1[1] || !m1[0] && m1[1]) && (m1[2] && !m1[1] || !m1[2] 
 && m1[1]) && (m1[2] && m1[0] + m1[1] == 0 || !m1[2] && m1[0] + 
 m1[1] != 0)) 
 for (int i = 0; i  3; i++) 
 cout  (char)('A' + i)  s12  s11[m1]  endl; 
 } 
 return ; 
} 
/* TODO (#1#): 四个被怀疑是小偷的人被抓了,知道他们中只有 
一个小偷 (m1[0]+m1[1]+m1[2]+m1[3]==1) 
a说 b没有偷 是 d偷的 
(m1[3]+m1[1]==1) 
b说 b没有偷 是 c偷的 
(m1[1]+m1[2]==1) 
c说 a 没有偷 是 b偷的 
(m1[0]+m1[1]==1) 
已知 三人要么说真话要么说假话 
问谁偷的 
 */ 
void z51() 
{ 
 string s11[2] = 
 { 
 "非贼", "贼" 
 } 
 , s12 = " 是"; 
 for (int j = 1; j = 16; j++) 
 { 
 bitset  4  m1(j); 
 //abcd 
 //0123 
 if ((m1[0] + m1[1] + m1[2] + m1[3] == 1) && (m1[1] + m1[2] == 1) && 
(m1[3] + m1[1] == 1) && (m1[0] + m1[1] == 1)) 
 for (int i = 0; i  3; i++) 
 cout  (char)('A' + i)  s12  s11[m1]  endl; 
 } 
 return ; 
} 
/* TODO (#1#): 黑与蓝 
五个人,帽子上贴着黑与蓝的标签。黑的说谎, 
蓝色的说真话,他们这样说: 
a说他看见3个蓝的标签(不包括他自己) 
如果他是真话那么有a=1 
b+c+d+e=3 
如果他是假话那么有!a=1 
b+c+d+e!=3 
也就是 
a&& b+c+d+e==3 || !a && b+c+d+e!=3 
b说有0个,c说有1个,d说有4个 
 */ 
void z52() 
{ 
 string s11[2] = 
 { 
 "黑色", "蓝色" 
 } 
 , s12 = " 是 "; 
 for (int j = 0; j  32; j++) 
 { 
 bitset  5  m1(j); 
 //abcdef 
 //012345 
 if (isHere(m1[0], m1[1], m1[2], m1[3], m1[4], 3) && isHere(m1[1], m1[0], 
 m1[2], m1[3], m1[4], 0) && isHere(m1[2], m1[0], m1[1], m1[3], m1[4], 
 1) && isHere(m1[3], m1[0], m1[1], m1[2], m1[4], 4)) 
 { 
 for (int i = 0; i  5; i++) 
 cout  (char)('A' + i)  s12  s11[m1]  endl; 
 } 
 } 
 return ; 
} 
int isHere(int x, int y, int a, int b, int c, int d) 
{ 
 int i; 
 i = (x && y + a + b + c == d) || (!x && y + a + b + c != d); 
 return i; 
} 
/* TODO (#1#): 三人要么说谎要么说真话 
a说有2个是说真话的 
b和c都说 有1个说真话的 
和上一题一样 
(x && y+a+b==d) || 
(!x && y+a+b!=d) 
 */ 
void z53() 
{ 
 string s11[2] = 
 { 
 "说谎者", "诚实者" 
 } 
 , s12 = " 是 "; 
 for (int j = 0; j  8; j++) 
 { 
							 
							 
							 
							  
							  
							  楼主 2016-02-12 14:23 回复
						 
						 
           
          
          
         
   
         
      
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知