9.17
1.给定一个n位数,看看这n位数中有多少个特殊质数。特殊质数:一个数从右边每次切去一个数后剩下的部分还是质数。比如7331,7331是质数,733还是质数,73是质数,7也是质数。已知1不是质数,求给定的n位数中,有多少个这样的质数。
(1)一开始我的思路,总是超时:
从n位数一个一个判定,但是从以2开头的数开始,如果开头是4,6,8,9的话,就直接将这类数跳过,结果超时了
(2)参考的方法:用深度搜索。开头的数只能是2,3,5,7且除了开头的数之外,别的数只能是1,3,7,9:
int sum=0;
main()
{
if(n1)
{
printf("%d\n%d\n%d\n%d\n",2,3,5,7);
return 1;
}
else
{
fns(2,1,n);
fns(3,1,n);
fns(5,1,n);
fns(7,1,n);
}
}
void fns(int x,int y,int n)
{
int i=1;
for(i;i<=9;i+=2)
{
if(test(x*10+i))
{
if(y+1n)
sum=sum+1;
else
fns(x*10+i,y+1,n);
}
}
}
}
test函数是判断是否为质数的函数。
2.判断字符串中是否包含另一个字符串的方法有:str1.contains(str2)和str1.indexOf(str2),二者的区别是:contains返回的是布尔类型true和false,二IndexOf返回的是第一次出现该字符串的索引位置,如果没有则返回-1。
注:目前还没找到可以判断一个字符串中是否包含某一个字符的方法,现在是通过将字符通过string.valueof()转换成字符串的形式,再进行判断。
3.想要知道一个字符串中的第几个位置的字符是什么,用str.charAt(int)函数,其中int表示str中的字符的索引位置,该函数返回的char类型。
4.将字符串转换成整型的函数有两个:Integer.parseInt(str)和Integer.valueOf(str),前者返回的是int进本类型,后者返回的是Integer类
5.java中字符串的输入,sn.next()和sn.nextLine()的区别是:
next()从有效位开始读入字符,如果有效字符前面是空格、enter、tab等都不会读进去,并且遇到空格、回车、tab等都会终止读入,所以next()函数不能读取含有空格的字符串。
nextLine()函数会读取前面的空格等字符,而且只有遇到回车键才会终止读入。
6.C语言中double在输出时和float一样,用%f,但是在读入时用的是%lf。
7.算法:求一元三次方程的解,已知这三个解释不同的实根,且在-100到+100之间,而且每个解之间的绝对值大于等于1,结果保留两位小数。
提示,对于x1和x2,如果f(x1)*f(x2)<0,则在x1和x2之间肯定有一个根。
(1)一开始写的:(利用上了提示信息,反而不对)
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
double i=-100;
for(i;i<100;i+=1.00){
double s1=cal(i);
double i1=i+1;
double s2=cal(i1);
double s=s1s2;
if(s1s2<=0){
double k=i;
for(k;k<i1;k+=0.01)
{
if((cal(k)<0.000001)&&(cal(k)>-0.000001)){
printf("%.2f ",k);
break;
}
}
}
}
输入为:1 -5 -4 20
结果为-2.00 -2.00 2.00 2.00 5.00
正确的应该是-2.00 2.00 5.00
其中cal是aiii+bii+ci+d;函数,用来求三次方程的解的。
想了好久不知道为什么,可能让一个double k<l1,精度上达不到吧
注:(用(cal(k)<0.000001)&&(cal(k)>-0.000001)来判断k是否是一个解,若满足则是一个解)
(2)改正后,用最原始的办法,没用到提示信息反而AC了
for(i;i<=100;i+=0.01){
if((cal(i)<0.000001)&&(cal(i)>-0.000001)){
printf("%.2f ",i);
}
}