如果x的x次幂结果为10(参见【图1.png】),你能计算出x的近似值吗?
显然,这个值是介于2和3之间的一个数字。
请把x的值计算到小数后6位(四舍五入),并填写这个小数值。
注意:只填写一个小数,不要写任何多余的符号或说明。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#define eps 1e-7
using namespace std;
int main()
{
double aim = 10.0;
double x;
double L=2.0, R=3.0;
//二分枚举
while(L-R < (-eps))
{
double mid=(L+R)/2;
if( pow(mid,mid) > aim ){
R=mid;
}else{
L=mid;
}
}
printf("%lf\n", pow(L, L)); //最后得到的是9.999999
printf("%lf %lf\n", L, R); //L=R=2.506184
return 0;
}
1/1 + 1/2 + 1/3 + 1/4 + ... 在数学上称为调和级数。
它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。
但是,它发散的很慢:
前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0
那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?
请填写这个整数。
注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
using namespace std;
int main()
{
double ans=0;
double i=1.0;
while(ans < 15.0){
ans+=(1.0/i);
i+=1.0;
}
printf("%lf %lf\n", ans, i);
return 0;
}
输入一个字符串,求它包含多少个单词。单词间以一个或者多个空格分开。
第一个单词前,最后一个单词后也可能有0到多个空格。
比如:" abc xyz" 包含两个单词,"ab c xyz " 包含3个单词。
如下的程序解决了这个问题,请填写划线部分缺失的代码。
注意:只填写划线部分的代码,不要填写任何多余的内容。比如已经存在的小括号,注释或说明文字等。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
using namespace std;
int get_word_num(char* buf)
{
int n = 0;
int tag = 1;
char* p = buf;
for( ;*p!=0&&*p!=13 && *p!=10; p++)
{
if(*p==' '&&tag==0) tag=1;
if( *p!=' ' && tag==1 ){
n++; tag=0;
}
}
return n;
}
int main()
{
char buf[1000];
fgets(buf, 1000, stdin);
printf("%d\n", get_word_num(buf));
return 0;
}
三羊献瑞(9分)
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
1085
手算,突破口是三一定等于1,继续往下推即可。
两条非常重要的结论
1,因为是加法算式三是进位出来的 所以是三是1
2,因为三是1且三加祥能进位,只有1+9能进位,所以祥是9
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
bool check(int *a){
return ((9*1000+a[0]*100+a[1]*10+a[2])+(1000+a[3]*100+a[4]*10+a[0])==(10000+a[3]*1000+a[1]*100+a[0]*10+a[5]));
}
int main(){
int a[]={0,2,3,4,5,6,7,8};
//int tem = 8*7*6*5*4*3*2*1;
while(1){
if(check(a)){
printf("%d\n",(1000+a[3]*100+a[4]*10+a[0]));
break;
}
next_permutation(a,a+8);
}
return 0;
}
加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,
并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。
思路:
1. 说思路其实也没什么思路,按照正常的解法一步一步的写出程序来就OK了。
2. 将1+2+3+ ... + 49其中的两个“+”变成“*”,用双重循环来遍历所有可能出现的结果。
3. 外层循环的变量i代表前一个“*”,内层循环中的j代表后一个“*”,依次遍历。
4. 用变量tmp来保存将程序中的前一个“+”改变成“*”过后的结果。代码为tmp = res = sum-(i+(i-1))+i*(i-1) ,读者需要仔细理解这句代码。
5. 用变量res来保存将程序中的后一个“+”改变成“*”过后的结果。代码为res = tmp-(j+(j-1))+j*(j-1) 。
6. 然后变量res判断的值是否为2015。如果是,则输出i和对于j的值。(题目中只要求求出前一个“*”所在的位置,即i的值)。
#include <stdio.h>
int main()
{
int sum = 1225;
int tmp=0; //临时变量,在程序中保存中间结果
int res=0; //用来保存将“+”改变成“*”号后的结果
for(int i=2; i<=47; ++i)
{
tmp = res = sum-(i+(i-1))+i*(i-1);
for(int j=i+2; j<=49; ++j)
{
res = tmp-(j+(j-1))+j*(j-1);
if(res == 2015)
{
printf("(i= %d ,j= %d)\n", i-1,j-1);
}
}
}
}
题目:
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
思路:
这道题的主要思路就是暴力循环,依题意“如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种”,主要要考虑的问题是不考虑花色,只考虑点数,那么四个人就是每人13张牌,也就是说,我们把扑克牌按点数平均分成13份(每份4张同样点数的牌),每份中有若干张牌(最小为0张,最大为4张)被发到小明手里,发给小明的这13份不同点数的牌的数量加起来一共有13张。这就是这道题按照暴力循环解答的思路。
#include<iostream>
using namespace std;
int main()
{
int a[13]={0};
int result=0,count=0;
for(a[0]=0;a[0]<=4;a[0]++)
{
for(a[1]=0;a[1]<=4;a[1]++)
{
for(a[2]=0;a[2]<=4;a[2]++)
{
for(a[3]=0;a[3]<=4;a[3]++)
{
for(a[4]=0;a[4]<=4;a[4]++)
{
for(a[5]=0;a[5]<=4;a[5]++)
{
for(a[6]=0;a[6]<=4;a[6]++)
{
for(a[7]=0;a[7]<=4;a[7]++)
{
for(a[8]=0;a[8]<=4;a[8]++)
{
for(a[9]=0;a[9]<=4;a[9]++)
{
for(a[10]=0;a[10]<=4;a[10]++)
{
for(a[11]=0;a[11]<=4;a[11]++)
{
for(a[12]=0;a[12]<=4;a[12]++)
{
if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13)
{
count++;
result=count;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
cout<<count<<endl;
return 0;
}