现有一个非常大的正整数M,最高位为1,其余均为0,请计算在[1,M][1,M]范围内有多少个完美
- 教育综合
- 2024-01-30 07:57:23
有会c++大哥吗?做一下这道题。不要use printf scanf
#include
#include
using namespace std;
//...............大数比较设定a>b返回1 a
int myCompare(string a,string b)//
{
if(a.size()!=b.size())//如果字符串长度不同那么长度大的那个就是更大的大数
{
if(a.size()>b.size())
return 1;
else
return -1;
}
else //如果字符串长度相同我们通过直接比较字符串的字典序来判断大小
{
if(a>b)
return 1;
else if(a==b)
return 0;
else
return -1;
}
}
//.............................................高精度加法.........................................
string myAdd(string a,string b)
{
int n=max(a.size(),b.size())+1;
vector
int i=a.size()-1,j=b.size()-1,k=n-1;//从个位开始通过模拟竖式进行大数加法
while(i>=0&&j>=0)//当两数均未加完时
{
ans[k--]=(a[i--]-'0')+(b[j--]-'0');//我们让我们的数组存储每一位相加的结果注意将字符串转为整型数字
}
//检测是否有某个数的高位未加完将其直接存入数组中
while(j>=0)
{
ans[k--]=(b[j--]-'0');
}
while(i>=0)
{
ans[k--]=(a[i--]-'0');
}
string c="";//创建一个字符串去存储答案
for(int i=n-1;i>0;i--)//因为之前的竖式加每一位都没考虑进位所以我们从最后开始检查进位
{//因为是加法如果有进位最多也就进一
if(ans[i]>=10)//如果大于10说明应该进位那么我们让此位减10它的高一位加1
{
ans[i]-=10;
ans[i-1]++;
}
c.insert(0,1,ans[i]+'0');//处理后的结果转化为字符插入结果字符的首位
}
if(ans[0]>0)//检查最最高位是否大于0如果两数相加没有进位那么这一位就是0我们就不必存储它否则则放入字符串
{
c.insert(0,1,ans[0]+'0');
}
return c;//返回答案
}
//...................................高精度减法...................................................
string mySubtract(string a,string b)
{
string c=""; //创建一个字符串去存储答案
if(myCompare(a,b)==0) //先比较一下两数大小如果相等我们直接返回0即可
return "0";
if(myCompare(a,b)==-1)//如果a
{
swap(a,b);
c.push_back('-');
}
int n=a.size();
//开辟一个足够存储结果的数组 减法结果的位数最多为位数最多的那个数的位数我们保证了a为的大数所以就是a的位数
vector
int i=a.size()-1,j=b.size()-1,k=n-1;//从个位开始模拟竖式减法
int t=0;//表示低位的借位情况 0:无借位 1:有借位
while(i>=0) //同加法一样模拟运算我们知道a是大数所以a遍历完竖式才完成
{
char nowb;//被减数当前位有数就正常减 没有数说明就是0
if(j>=0) nowb=b[j];
else nowb='0';
ans[k]=a[i]-nowb-t;//对应位相减同时减去低位的借位
if(ans[k]<0)//如果结果小于0 则向高位借一位
{
t=1;
ans[k]+=10;
}
else t=0; //否则向高位无借位
k--,i--,j--; //继续判断高一位
}
bool flag=true;//这里与加法不同高位可能出现多个零开头的情况我们需要找到第一不是零的地方再存数
for(int i=0;i
{
if(flag&&ans[i]==0)//如果当前数为0且未存数则不执行存数操作
continue;
flag=false; //一旦存入数更改标志位
c.push_back(ans[i]+'0');
}
return c; //返回结果
}
//.......................................高精度乘法...............................................
string myMultiply(string a,string b)
{
if(a=="0"||b=="0") //其中有一个为0时直接返回0
return "0";
vector
int n=a.size(),m=b.size();
ans.resize(n+m,0); //乘法结果的位数最多为两数的位数之和
for(int i=0;i
{ //例如个位乘百位的结果 以及十位乘十位的结果 都放到百位上
for(int j=0;j
{
ans[i+j+1]+=(a[i]-'0')*(b[j]-'0');
}
}
for(int i=n+m-1;i>0;i--) //我们从低位开始检查进位
{
if(ans[i]>=10) //如果大于10说明有进位但乘法的进位不一定只进1
{
ans[i-1]+=(ans[i]/10);//高位加地位的高于个位部分
ans[i]%=10; //低位对十求余
}
}
string c =""; //创建字符串存储答案
bool flag=true; //同减法一样找到第一个不是0的位置开始存数
for(int t=0;t
{
if(flag&&ans[t]==0)
continue;
flag=false;
c.push_back(ans[t]+'0');
}
return c; //返回答案
}
//..........................................高精度除法............................................
vector
{
vector
if(myCompare(a,b)==-1) //如果被除数比除数小商为0余数为a返回答案即可
{
ans[1]=a;
return ans;
}
else if(myCompare(a,b)==0)//如果被除数与除数相等商为1余数为0返回答案即可
{
ans[0]="1";
return ans;
}
else //否则我们需要模拟除法的竖式来进行计算
{
string res="";//创建存储商的字符串
int m1=a.size(),m2=b.size();
string a1=a.substr(0,m2-1);
for(int i=m2-1;i
{
if(a1=="0") //如果a1为0为了防止a1出现0开头的情况我们将它清空
a1="";
a1.push_back(a[i]); //我们从被除数中取一个数放入a1继续减
int e=0;
while(myCompare(a1,b)>=0)//当a1大于等于除数时便一直减同时e累加
{
e++;
a1=mySubtract(a1,b);
}
if(res.size()||e) //如果res不为空或者e不为0我们存储他
res.push_back(e+'0');
}
ans[0]=res; //最后res就是商
ans[1]=a1; //a1就是余数
return ans; //返回答案
}
}
//......................................................................................
string myFactorial(string a)//高精度阶乘
{/*我们还可以利用高精度减法和乘法实现大数的阶乘(最大可运行出10000左右的阶乘)*/
if(a=="1")
return a;
else
return myMultiply(a,myFactorial(mySubtract(a,"1")));
}
//......................................................................................
int main()
{
string a,b;
string c;
vector
cin>>a>>b;
c = myAdd(a,b);
divide_ans = myDivide(c,"2");
cout<
return 0;
}
这道题第二问3t+2t+10为什么加10,3t一2t一10为什么减10详细解释下谢谢
一、速度 1、公式: a= vt=v0+at 反映出做匀变速直线运动的物体的瞬时速度如何随时间而变化 若v0=0,则:vt=at 2、图象(速度-时间图象),见图1。 (1)vt=v0+at:v0、a为定值 t:自变量 vt:因变量 从表达式可知,vt是t的一次函数 (2)截距:v0;斜率:a 图2中, I 和 II 两个运动的初速度不同,其中 I 的初速度为0, II 的初速度不为零,但是两个运动的加速度相同(a1=a2)。运动 II I的初速度也不为0,但是加速度大于 I 和 II 。 二、位移 1、公式: S=v0t+at2 反映出做匀变速直线运动的物体的位移如何随时间而变化。 若v0=在验证机械能守恒定律的实验中,一同学进行如下操作A.将打点计时器水平固定在铁架台上B.将长约0.5m的纸
(1)A、应该将打点计时器竖直固定在铁架台上,故A错误; C、实验时,应先接通打点计时器电源后释放重物,由于重物运动较快,可能会使打出来的点很少,不利于数据的采集和处理,故C错误. 故答案为:AC. (2)选用最小刻度为mm的刻度尺,应该估读到毫米的下一位,故OC读数不符合有效数字要求,应该读为25.90cm, 重力势能的减小量等于重力做功,因此有: △E P =mgh=2.65J 匀变速直线运动中,时间中点的瞬时速度等于该过程中的平均速度,因此有: v B =
△ E k =
故答案为:OC、25.90、2.65.2.56. (3)由于空气阻力以及纸带与打点计时器之间的摩擦阻力作用,导致重力势能没有全部转化为动能,因此实验中往往出现重锤重力势能的减少量大于动能的增加量. 故答案为:摩擦阻力的作用. |
C语言新手,在lr里写一个去除空格的程序,但是打印出来都是空的,麻烦各位高手帮我看看
/*给你改了下,经测试可运行,你可以参考修改,希望可以帮到你*/
#include
#include
#include
intmain()
{
char*str="ddsswedfewfsdfwe";
intstr_len=strlen(str);
char*desc=(char*)calloc(1,str_len);
printf("原字符串为:%s\n",str);
for(size_ti=0,j=0;iif(str[i]!='')
desc[j++]=str[i];
printf("去除后空格后的字符串为:%s\n",desc);
free(desc);
return0;
}
已知二次函数g(x)的图像经过坐标原点,且满足g(x+1)=g(x)+2x+1,设函数f(x)=mg(x)-㏑(x+1),其中m为非零常数
(1) 设g(x)=ax^2+bx+c 若二次函数g(x)的图象经过坐标原点,则常数c=0 g(x)=ax^2+bx g(x+1)=a(x+1)^2+b(x+1)=ax^2+(2a+b)x+a+b g(x)+2x+1=ax^2+(b+2)x+1 若g(x+1)=g(x)+2x+1,则2a+b=b+2、a+b=1 解得:a=1、b=0 g(x)=x^2 (2) f(x)=mx^2-ln(x+1)(x>-1) f'(x)=2mx-1/(x+1)=(2mx^2+2mx-1)/(x+1) 若f(x)是单调函数,则f'(x)>=0或f'(x)<=0在区间(-1,+无穷)上恒成立。 即2mx^2+2mx-上一篇
奈的教育日记在哪下载
下一篇
返回列表