11题、在123456789中插入3个乘号,使得乘积最大?请问乘积最大是多少?
根据符号的位置把 123456789 划分了 4 段,再让这四段相乘,取最大值。 一开始是想一直套循环,
//请在123456789 中插入3 个乘号,使得乘积最大?请问乘积最大是多少?
int product(int i, int j)
{
int p=0 ;
for (i=i; i<=j;i++)
{
p = p*10 +i; // 0 *10 +1 ==> 1 *10 +2 ==> 12 *10 +3 ==> 123 *10 +4
}
return p;
}
int main()
{
int i, j, k, p=0 ;
int s1, s2, s3, s4, s ;
for (i=1 ; i<7 ;i++) // 第一部分到达的最大值
for (j=1 +i; j<8 ;j++)
for (k=j+1 ; k<9 ; k++)
{
s1 = product(1 ,i);
s2 = product(i+1 , j);
s3 = product(j+1 , k);
s4 = product(k+1 , 9 );
s = s1*s2 *s3 *s4 ;
if (s >p)
p = s ;
}
printf ("%d " , p);
return 0 ;
}
第12题、请在5483298756中插入3个乘号,使得乘积最大?请问乘积最大是多少?
很明显我这个是错的,,因为int型的数据类型,最多处理10位数,所以显而易见的会越界,得出错误的数据。 我的想法是,应该要把它装换成字符类型的再进行计算,,比如N位的数据可以分解为:
x = x n 1 + x 2 并 且
\ y = y_1^n + y_2 那么x和y的乘积可计算为:$$\ xy = (x_1^n+x_2)( y_1^n + y_2) = x_1^n*y_1^n + (x_1y_2+x_2y_1) +x_2*y_2 这样就将x和y装换成比较小的位数的乘积。
//请在5483298756 中插入3 个乘号,使得乘积最大?请问乘积最大是多少?
//数字越界啊,要用字符运算,,,不想做了,先空着。
int product(int i, int j)
{
int n[10 ] = {5 ,4 ,8 ,3 ,2 ,9 ,8 ,7 ,5 ,6 };
printf ("$% d$ $% d$ " , n[i-1 ],n[j-1 ]);
unsigned int p=0 ;
for (i=i; i<=j;i++)
{
p = p*10 +n[i-1 ];
}
printf ("#%d #\n" , p);
return p;
}
int main()
{
int i, j, k;
unsigned int s , p=0 ;
int s1, s2, s3, s4;
for (i=1 ; i<7 ;i++)
for (j=1 +i; j<8 ;j++)
for (k=j+1 ; k<9 ; k++)
{
s1 = product(1 ,i);
s2 = product(i+1 , j);
s3 = product(j+1 , k);
s4 = product(k+1 , 10 );
s = s1*s2 *s3 *s4 ;
printf (" ^%d ^ \n" , s );
if (s >p)
p = s ;
}
printf ("%d " , p);
return 0 ;
}
//我已经想好了一个三位数abc(a是百位,b是十位,c是个位)。
//并且告诉你acb、bac、bca、cab、cba的和是2012 。
//你知道我所想的那个数是多少吗?
int main()
{
int a, b, c;
int s1, s2, s3, s4, s5;
for (a=0 ; a<=9 ;a++)
for (b=0 ; b<=9 ;b++)
for (c=0 ; c<=9 ; c++)
{
s1 = a*100 + c*10 + b; //acb
s2 = b*100 + a*10 + c; //bac
s3 = b*100 + c*10 + a; //bca
s4 = c*100 + a*10 + b; //cab
s5 = c*100 + b*10 + a; //cba
if (s1+ s2+ s3+ s4+ s5 == 2012 )
printf ("%d , %d , %d " , a,b,c);
}
return 0 ;
}
//请将1 ~9 这9 个阿拉伯数字分别填入9 个□中。每个数字只能使用一次。使得等式成立。
//□□□+□□□=□□□
//例如173 +286 =459 就是一个合理的组合,请问一共所有少种合理的组合?
//注意:173 +286 =459 与 286 +173 =459 是同一种组合!
# include "stdio.h"
int total = 0
int blook[9 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
int n[370 ], len
void dfs(int step, int a [])
{
int i, j, p = 0
if (step == 10 )
{
if (a [1 ] * 100 + a [2 ] * 10 + a [3 ] + a [4 ] * 100 + a [5 ] * 10 + a [6 ] == a [7 ] * 100 + a [8 ] * 10 + a [9 ])
{//满足要求,打印
//数组占内存总空间,除以单个元素占内存空间大小
for(j=0
{
if (n[j] == a [4 ] * 100 + a [5 ] * 10 + a [6 ] ) // 该数已经存在
{
p = 1
break
}
}
if (p==0 )
{
total += 1
printf("%d%d%d + %d%d%d = %d%d%d\n" , a [1 ],a [2 ],a [3 ], a [4 ], a [5 ], a [6 ], a [7 ], a [8 ], a [9 ])
n[len] = a [1 ] * 100 + a [2 ] * 10 + a [3 ]
len++
}
}
return
}
for (i=1
{
if (blook[i] == 0 )
{
a [step] = i
blook[i] = 1
dfs(step+1 , a )
blook[i] = 0
}
}
}
int main()
{
int a [9 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
dfs(1 , a )
printf(" %d " , total)
return 0
}
//请将1 ~9 这9 个阿拉伯数字分别填入9 个□中。每个数字只能使用一次。使得等式成立。
//□□*□ □□=□□□□
//例如12 *483 =5796 就是一个合理的组合,请问一共所有少种合理的组合?
//注意:12 *483 =5796 与 483 *12 =5796 是同一种组合!
int total = 0 ;
int blook[9 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
int n[370 ], len;
void dfs(int step, int a[])
{
int i, j, p = 0 ;
if (step == 10 )
{
if ((a[1 ] * 10 + a[2 ]) *( a[3 ]*100 + a[4 ] * 10 + a[5 ]) == a[6 ] *1000 + a[7 ] * 100 + a[8 ] * 10 + a[9 ])
{// 满足要求,打印
total += 1 ;
printf ("%d %d * %d %d %d = %d %d %d %d \n" , a[1 ],a[2 ],a[3 ], a[4 ], a[5 ], a[6 ], a[7 ], a[8 ], a[9 ]);
}
return ;
}
for (i=1 ; i<=9 ; i++)
{
if (blook[i] == 0 )
{
a[step] = i; // 将数放入对应数组中,
blook[i] = 1 ; // 1 ,表示该数已经被使用
dfs(step+1 , a); // 递归调用
blook[i] = 0 ; // 回收,方便下一次调用
}
}
}
int main()
{
int a[9 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
dfs(1 , a);
printf (" %d " , total);
return 0 ;
}
第16题、10000000内7的倍数以及尾数为7的数的个数是多少
# include "stdio.h"
int main()
{
int i, sum = 0 , a;
for (i=1 ; i<=10000000 ; i++)
{
a = i%10 ;
if (a==7 || i%7 == 0 )
{
sum ++;
}
}
printf("%d" , sum );
return 0 ;
}