下午手贱JavaScript写了个题,当然了最后也没通过,不是我代码问题,我换了三个四个浏览器,输出都没问题,但是提交OJ的判定系统就说我没有输出😢,(当然这个为题解决了,看下边)
牛客网提示没有输入输出数据
我一下午都在疑惑为什么说我没输入输出,因为牛客网的判题系统问题,JavaScript输入我用的是prompt(),后来查了官方,官方说要用readline()输入。😃 无语了。
牛客网JavaScript V8引擎是利用了readline()接收输入的每一行,该行字符数不能超过1024个。在这里readline是可以重载的,也就是说每一次调用readline()就会识别一行输入数据,多行输入其实就是写多个readline()即可。
牛客网输出函数用print()和console.log()都可以,但是document.write()不行哦,会提示超时。
题目
题目描述
依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩。
输入描述:
学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。
输出描述:
学号,3科成绩,输出格式详见输出样例。
示例1
输入
17140216;80.845,90.55,100.00
输出
The each subject score of No. 17140216 is 80.85, 90.55, 100.00.
答案
C语言答案
当然了这个题用C语言写很简单,代码如下:
#include
int main()
{
long s;
float a,b,c;
scanf("%d;%f,%f,%f",&s,&a,&b,&c);
printf("The each subject score of No. %d is %.2f, %.2f, %.2f.\n",s,a,b,c);
}
JavaScript答案
var str = readline();
var result = "The each subject score of No. "; //使用result来保存结果是因为后面的步骤中,否则控制台无法在一行中输出
var pos = str.search(";"); //找到;
result += str.slice(0, pos);//分出学号
result += " is ";
str = str.slice(pos + 1, str.length);//把学号从字符串中裁掉
var StrArray = new Array();//定义数组
StrArray = str.split(","); //剩余部分字符串按照`,`分割
for(i = 0; i < StrArray.length; i++) {//存入数组中
StrArray[i] = +StrArray[i];
StrArray[i] = Math.round(StrArray[i] * 100) / 100.; //四舍五入
StrArray[i] = StrArray[i].toFixed(2); //保留两位小数 ,避免100.00只显示100的情况
if(i != StrArray.length - 1)
result += StrArray[i] + ",";
else
result += StrArray[i] + ".";
}
document.write(result);//网页输出 输出,二选一即可,a题过程中建议用
console.log(result);//控制台输出 输出,二选一即可,a题过程中建议用
JavaScript字符串处理总结
学过其他语言的理解起来应该会很方便,字符串可以是插入到引号中的任何字符。你可以使用单引号或双引号
字符串属性
属性
描述constructor
对创建该对象的函数的引用
length
字符串的长度
prototype
允许您向对象添加属性和方法
字符串方法
属性
描述
示例:var str = "HELLO WORLD";
输出toString()
返回一个字符串。
charAt()
返回在指定位置的字符。
var n = str.charAt(1)
E
concat()
连接两个或更多字符串,并返回新的字符串。
var n = str.concat("!");
HELLO WORLD!
search()
查找与正则表达式相匹配的值。
str.indexOf("ld");
9
indexOf()
返回某个指定的字符串值在字符串中首次出现的位置。
str.indexOf("L");
2
includes()
查找字符串中是否包含指定的子字符串。
var n=str.includes("ld");
var n=str.includes("llo",10);
true
false
lastIndexOf()
从后向前搜索字符串,并从起始位置(0)开始计算返回字符串最后出现的位置。
replace()
在字符串中查找匹配的子串, 并替换与正则表达式匹配的子串。
str = str.replace("HELLO","hi");
hi WORLD
slice()
提取字符串的片断,并在新的字符串中返回被提取的部分。
var n1=str.slice(1,5);
var n2=str.slice(4);
ELLO
O WORLD
substr()
从起始索引号提取字符串中指定数目的字符。
var n2=str.substr(1,5);
ELLO
substring()
提取字符串中两个指定的索引号之间的字符。
var n1=str.substring(1,5);
ELLO
split()
把字符串分割为字符串数组。
var n=str.split(" ");
HELLO,WORLD
startsWith()
查看字符串是否以指定的子字符串开头。
toLowerCase()
把字符串转换为小写。
str.toLowerCase()
hello world
toUpperCase()
把字符串转换为大写。
toLocaleLowerCase()
根据本地主机的语言环境把字符串转换为小写。
toLocaleUpperCase()
根据本地主机的语言环境把字符串转换为大写。
trim()
去除字符串两边的空白
var str = " aaa aaa "
aaa aaa
valueOf()
返回某个字符串对象的原始值。
charCodeAt()
返回在指定的位置的字符的 Unicode 编码。
fromCharCode()
将 Unicode 编码转为字符。
match()
查找找到一个或多个正则表达式的匹配。
repeat()
复制字符串指定次数,并将它们连接在一起返回。
str = str.repeat(3);
Hello worldHello worldHello world
保留两位小数
.toFixed()银行家舍入法
许多人会说用这个来四舍五入,但是使用的是银行家舍入法,并不符合我们常理中的四舍五入,因此想精确四舍五入看方法3
不四舍五入
2.1 向下取整,先把小数变整数:
Math.floor(15.7784514000 * 100) / 100 //输出结果为 15.77
2.2 先将数据转换为字符串,最后再转为数值类型
Number(15.7784514000.toString().match(/^\d+(?:\.\d{0,2})?/)) // 输出结果为 15.77,不能用于整数如 10 必须写为10.0000
注意:如果是负数,请先转换为正数再计算,最后转回负数
精确的四舍五入
toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,这种规则不符合我们平常在数据中处理的方式。为了解决这样的问题,提出两种方法:
1. Math.round方法
round()方法可把一个数字舍入为最接近的整数,也就是我们意义上的四舍五入,但是只能取整数部分。
因此我们可以将数字扩大两倍,使用round()获得四舍五入得到的整数部分,然后再除100即可。
Math.round(num* 100) / 100.
但是如果要保留两位小数,一定要加上num = num.toFixed(2),这样可以防止小数部分为0的数字只显示整数部分,例如99.00只显示99。
Math.round(num* 100) / 100.
num = num.toFixed(2);
Math.round(x),它虽然不会产生精度问题,但是它有一点小陷阱容易忽略。下面是它的舍入的策略:
如果小数部分大于 0.5,则舍入到下一个绝对值更大的整数。
如果小数部分小于 0.5,则舍入到下一个绝对值更小的整数。
如果小数部分等于 0.5,则舍入到下一个正无穷方向上的整数。
所以,对 Math.round(-1.5),其结果为 -1,这可能不是我们想要的结果。因此负数时候要分开讨论。
2.重定义toFixed()
由于toFixed()是银行家舍入法,我们可以重新写一个toFixed(),代码如下直接复制即可。
num = num.toFixed(2);
Number.prototype.toFixed = function(d) {
var s = this + "";
if(!d) d = 0;
if(s.indexOf(".") == -1) s += ".";
s += new Array(d + 1).join("0");
if(new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (d + 1) + "})?)\\d*$").test(s)) {
var s = "0" + RegExp.$2,
pm = RegExp.$1,
a = RegExp.$3.length,
b = true;
if(a == d + 2) {
a = s.match(/\d/g);
if(parseInt(a[a.length - 1]) > 4) {
for(var i = a.length - 2; i >= 0; i--) {
a[i] = parseInt(a[i]) + 1;
if(a[i] == 10) {
a[i] = 0;
b = i != 1;
} else break;
}
}
s = a.join("").replace(new RegExp("(\\d+)(\\d{" + d + "})\\d$"), "$1.$2");
}
if(b) s = s.substr(1);
return(pm + s).replace(/\.$/, "");
}
return this + "";
};