3.两个数相乘,小数点后位数没有限制,请写一个高精度算法 与大数相乘原理一样,只是调整小数点位输入 string a,string b;计算string c=a*b; 返回 c;1.纪录小数点在a,b中的位置l1,l2,则需要小数点

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/11 16:46:09
3.两个数相乘,小数点后位数没有限制,请写一个高精度算法 与大数相乘原理一样,只是调整小数点位输入 string a,string b;计算string c=a*b; 返回 c;1.纪录小数点在a,b中的位置l1,l2,则需要小数点

3.两个数相乘,小数点后位数没有限制,请写一个高精度算法 与大数相乘原理一样,只是调整小数点位输入 string a,string b;计算string c=a*b; 返回 c;1.纪录小数点在a,b中的位置l1,l2,则需要小数点
3.两个数相乘,小数点后位数没有限制,请写一个高精度算法 与大数相乘原理一样,只是调整小数点位
输入 string a,string b;计算string c=a*b; 返回 c;
1.纪录小数点在a,b中的位置l1,l2,则需要小数点后移动位置数为l=length(a)+length(b)-l1-l2-2;
去掉a,b中的小数点,(a,b小数点后移,使a,b变为整数)
计算c=a*b; (要么用java的BigInterger搞,要么自己用C++写高精度数乘法,超过百万位,用FFT,我就不细说,这都预先写过就别做了)
输出c,(注意在输出倒数第l个数时,输出一个小数点。若是输出的数少于l个,就补0)
要求给出符合要求的程序

3.两个数相乘,小数点后位数没有限制,请写一个高精度算法 与大数相乘原理一样,只是调整小数点位输入 string a,string b;计算string c=a*b; 返回 c;1.纪录小数点在a,b中的位置l1,l2,则需要小数点
import java.util.*;
class AddBigNumber{

public static StringBuffer Mul(StringBuffer s1,StringBuffer s2){
StringBuffer sb=new StringBuffer();
for(int i=0;isb.append(0);
for(int i=s1.length()-1;i>=0;i--){
for(int j=s2.length()-1;j>=0;j--){
int m=(int)(s1.charAt(i)-'0')*(int)(s2.charAt(j)-'0');
int n=i+j+1;
int x=(int)(sb.charAt(n)-'0');
x=x+m;
char c=String.valueOf(x%10).charAt(0);
sb.setCharAt(n,c);
while(x>=10){
m=x/10;
n--;
x=(int)(sb.charAt(n)-'0');
x=x+m;
c=String.valueOf(x%10).charAt(0);
sb.setCharAt(n,c);
}
}
}
return sb;

}
public static void main(String[] args){

StringBuffer sb=new StringBuffer("1");
StringBuffer s;
for(int i=1;i<=2010;i++){
s=new StringBuffer(String.valueOf(i));
sb=Mul(s,sb);
}
int j=0;
while(sb.charAt(j)-'0'==0){
j++;
}
sb.replace(0,j,"");
System.out.println(sb);
}
}
你只要将输入的小数变整数,到最后在将小数点加上就行了.

小数是我国最早提出和使用的。早在3世纪,我国古代数学家刘徽在解决一个数学问题时就提出把整数个位以下无法标出名称的部分称为徽数。
小数的名称是13世纪我国元代数学家朱世杰提出的。在13世纪中叶我国出现了低一格表示小数的记法.
在西方,小数出现很晚,直到16世纪,法国数学家克拉维斯首先使用了小数作为整数部分与小数部分分界的记号。
虽然我国对小数的认识远远早于欧洲,但现代数学中所...

全部展开

小数是我国最早提出和使用的。早在3世纪,我国古代数学家刘徽在解决一个数学问题时就提出把整数个位以下无法标出名称的部分称为徽数。
小数的名称是13世纪我国元代数学家朱世杰提出的。在13世纪中叶我国出现了低一格表示小数的记法.
在西方,小数出现很晚,直到16世纪,法国数学家克拉维斯首先使用了小数作为整数部分与小数部分分界的记号。
虽然我国对小数的认识远远早于欧洲,但现代数学中所使用的小数的表示法却是从欧洲传入我国的。欧洲关于十进小数的最大贡献者是荷兰工程师斯蒂文(Simon Stevin,1548?1620)。他从制造利息表中体会到十进小数的优越性,因此他竭力主张把十进小数引进到整个算术运算中去,使十进小数有效地参与记数。不过,斯蒂文的小数记法并不高明,如139.654,他写作135⊙6①5②4③,每个数后面圈中的数是用来指明它前面数字位置的,这种表示方法,使小数的形式复杂化,并且给小数的运算带来很大的麻烦。1592年,瑞士数学家布尔基(Jobst Burgi)对此作出较大的改进。他用一空心小圆圈把整数部分和小数部分隔开,比如把36.548表示为36。548,这与现代的表示法已极为接近。大约过了一年,德国的克拉维斯,首先用黑点代替了小圆圈。他在1608年发表的《代数学》中,将他的这一做法公之于世,至此,小数的现代记法才被确立下来。追问我要被老师骂了、做得太简单了、而且文字太少........... 回答再帮你添加一点内容吧,这两个素材你可以适当的做一些整理。
小数点,数学符号,用于在十进制中隔开整数部分和小数部分。
小数点的由来
中国自古以来就使用十进位制计数法,一些实用的计量单位也采用十进制,所以很容易产生十进分数,即小数的概念。第一个将这一概念用文字表达出来的是魏晋时代的刘徽。他在计算圆周率的过程中,用到尺、寸、分、厘、毫、秒 、忽等7个单位;对于忽以下的更小单位则不再命名,而统称为“微数”。
到了宋、元时代,小数概念得到了进一步的普及和更明确的表示。杨辉《日用算法》(1262年)载有两斤换算 的口诀:“一求,隔位六二五;二求,退位一二五”,即1/16=0?0625;2/16=0?125。 这里的“隔位”、“退位”已含有指示小数点位置的意义。秦九韶则将单位注在表示整数部分个位的筹码之下,例如: —Ⅲ—Ⅱ表示13.12寸 寸是世界上最早的小数表示法。
在欧洲和伊斯兰国家,古巴比伦的六十进制长期以来居于统治地位,一些经典科学著作都是采用六十进制,因此十进制小数的概念迟迟没有发展起来。15世纪中亚地区的阿尔卡西(?~1429)是中国以外第一个应用小数的人。欧洲数学家直到16世纪才开始考虑小数,其中较突出的是荷兰人斯蒂文(1548~1620),他在《论十进制》(1583年)一书中明确表示法。例如把5.714记为:5◎7①1②4③或5,7'1''4'''。而第一个把小数表示成今日世界通用的形式的人是德国数学家克拉维斯(1537~1612),他在《星盘》(1593年)一书中开始使用小数点作为整数部分与小数部分之间的分界符。
而中国比欧洲早采用了三百多年。
小数点尽管小,但是作用极大。我们时刻都不可忽略这个小小的符号。因为这个不起眼的差错,人类酿过一个又一个悲剧。正可谓“差之毫厘,谬以千里”。1967年,前苏联“联盟一号”坠毁事件,造成了不可挽回的损失。直接原因是在地面检查时,忽略了一个小数点……导致了数亿元财富的损失,人类还失去了一位太空英雄----科马洛夫的生命! 追问虽然你的内容不错,我也看得懂,可是只能当天做啊......我都交了...算了吧

收起

我自己写的高精度算法,+-*/都能算,不过你只要*,中间multiply肯定能用,前面数据结构可以自己改改,后面主函数零时写的不知到有错没,应该能用,高精度,随便算,哈哈哈~~~~~~~~
#include
#include
#include
#define N 500
#define M 4...

全部展开

我自己写的高精度算法,+-*/都能算,不过你只要*,中间multiply肯定能用,前面数据结构可以自己改改,后面主函数零时写的不知到有错没,应该能用,高精度,随便算,哈哈哈~~~~~~~~
#include
#include
#include
#define N 500
#define M 400
using namespace std;
typedef struct number{
int num[N];
int len;
int nlen;
int mlen;
}data;
void initial(data *x)
{
int i = 0;
for (i=0;i x ->num[i] = 0;
}
void len_print(data x)
{
cout << "len:" << x.len << '\n'
<< "nlen:" << x.nlen << '\n'
<< "mlen:" << x.mlen << '\n'
<< '\n';
}
void exchange(char * str,data * x)
{
int len = 0;
int nlen = 0;
int i = 0;
while (str[len] != '\0')
len++;
while (str[nlen] != '.' && str[nlen] != '\0')
nlen++;
x ->len = len;
x ->nlen = nlen;
if (x ->len > x ->nlen)
x ->len --;
x ->mlen = x ->len - x ->nlen;
for (i=0;ilen;i++)
{
if (str[len-1-i]=='.')
len --;
x ->num[i] = str[len-1-i] - '0';
}
}
void r_print(data x)
{
int i = 0;
switch (x.num[N-1])
{
case 1 : cout << '+';break;
case -1 : cout << '-';break;
}
for (i=x.len-1;i>=x.mlen;i--)
cout << x.num[i];
if (x.mlen)
cout << '.';
for (;i>=0;i--)
cout << x.num[i];
cout << '\n';
}
data multiply(data x,data y,data & r)
{
data *max_n = &x,*min_n = &x;
if (x.len > y.len)
min_n = &y;
else
max_n = &y;
int i = 0,j = 0,t = 0,h = 0;
for (t=0,j=0;jlen;j++,t++)
for (h=t,i=0;ilen;i++,h++)
{
r.num[h] += max_n ->num[i] * min_n ->num[j];
r.num[h+1] += r.num[h] / 10;
r.num[h] %= 10;
}
r.len = x.len + y.len - 1;
r.mlen = x.mlen + y.mlen;
if (r.num[r.len])
r.len++;
r.nlen = r.len - r.mlen;
r.num[N-1] = x.num[N-1] * y.num[N-1] > 0 ? 1 : -1;
return r;
}
int main()
{
char str1[N] = {'\0'};
char str2[N] = {'\0'};
char op;
data x;
data y;
data r;
while (1)
{
puts("this program can count + - * /,example:\n1\n*\n1\ninput x,y:");
cin >> str1 >> op >> str2;
initial(&r);
initial(&x);
initial(&y);
exchange(str1,&x);
exchange(str2,&y);
x.num[N-1] = 1;
y.num[N-1] = 1;
switch (op)
{
case '+':
plus_minus(x,y,r);
break;
case '-':
y.num[N-1] = -1;
plus_minus(x,y,r);
break;
case '*':
multiply(x,y,r);
break;
case '/':
divide(x,y,r);
break;
default:
cout << "data or op error\n";
continue;
}
r_print(x);
len_print(x);
r_print(y);
len_print(y);
puts("answer:");
r_print(r);
len_print(r);
}
getchar();
return 0;
}

收起

可以

3.两个数相乘,小数点后位数没有限制,请写一个高精度算法 与大数相乘原理一样,只是调整小数点位输入 string a,string b;计算string c=a*b; 返回 c;1.纪录小数点在a,b中的位置l1,l2,则需要小数点 两个数乘,小数点后位数没有限制,请写一个高精度的算法 用1到8八个数字分别组成两个四位数,是相乘后乘积最大,请写出这两个数 两个数相乘,积的小数位数一定等于两个数的小数位数之和. 三个数相乘,可以先把相乘后能【 】的两个数相乘,在和【 】相乘 对讲机的频率问题不知道是不是所有的没有键盘的对讲机频率小数点后面都是5位数 比如:470.12345 带有键盘操作的对讲机输入频率则是小数点后面只有3位数 比如:470.123 两款对讲机小数点后 两个数相乘,如果一个因数扩大9倍,另一个因数缩小3倍后所得的积是你36.这两个数相乘的是(). 两个四位数相乘等于37659377,这两个数分别是多少?同题,相乘为67462333,这两个数为多少? 请问加班费计算有小数点的,要算到哪几位数,是根据四舍五入原则算到小数点后3位数吗? 两个数相乘有一个因数的个位位数6看成3和9结果分别是552,696 问正确积是?(要有过程) 求正则表达式,例如 102.21(2.1)302.3,xxx.xx,小数点前面不限制位数,保留小数点后两位小数,数字由0-9.急切求表达式!c#,验证输入格式例如:102.21(2.1)302.3 或输入 9999.99.小数点前无位数限制,小数点后 一个四位数,两位加上小数点后再与原数相加,和是2012.93.这个四位数是多少? c++ 小数点后面的位数问题我要统计一个小数后面位数的问题,比如我输入a=123.456,然后在后面中用到的小数点后的数b=456和小数点后位数为n=3,对我的问题不同请提出来谢谢 两个数的小数点和是148.5把其中一个数的小数点向右移动一位后,两个数相等,这两个数分别是多少 怎样计算 两个数相乘后有多少位?学校布置的任务:输入两个数,输出它们相乘后的位数.【例如 输入123 500 输出 5】任务提示是用 log()计算最简单,给点提示就行 matlab中更改小数点后显示位数 javascript如何取小数点后四位数? π值小数点后第100位数