共有回帖数 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号
意见反馈 |
关于直线 |
版权声明 |
会员须知